寒假作业Day 08

news2025/1/11 9:54:20

寒假作业Day 08

一、选择题

1、下列关于 const 和 #define 定义常量的区别,说法不正确的有( )
A: define宏是在预处理阶段展开。const常量是编译运行阶段使用
B: 宏没有类型,不做任何类型检查,仅仅是展开。const常量有具体的类型,在编译阶段会执行类型检查
C: define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。const常量会在内存中分配(可以是堆中也可以是栈中)
D: const定义和#define定义的常量在程序运行过程中只有一份拷贝

A: define宏是在预处理阶段展开。const常量是编译运行阶段使用
这个说法是不完全正确的。#define宏确实是在预处理阶段展开,但是const常量并不是在编译运行阶段使用,而是在编译阶段就已经确定了其值,并且在运行时是不可变的。所以,A选项中的“编译运行阶段使用”是不准确的。

B: 宏没有类型,不做任何类型检查,仅仅是展开。const常量有具体的类型,在编译阶段会执行类型检查
这个说法是正确的。#define宏只是简单的文本替换,没有类型,也不做类型检查。而const常量是有类型的,并且在编译阶段会进行类型检查。

C: define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。const常量会在内存中分配(可以是堆中也可以是栈中)
这个说法也是正确的。宏在预处理阶段会根据其在代码中的使用次数进行展开,并且不会分配内存。而const常量确实会在内存中分配存储空间,具体是在栈中还是堆中取决于其定义的位置和方式。

D选项说的是:“const定义和#define定义的常量在程序运行过程中只有一份拷贝。” 这个说法中,“const定义在程序运行过程中只有一份拷贝”是正确的,因为const常量在内存中确实有唯一的存储空间。但是,将#define宏与const常量相提并论,并说它们都有一份拷贝是不准确的,因为#define宏只是文本替换,并没有在内存中分配存储空间。

在这里插入图片描述

这个宏接收两个参数 x ,y,如果在上述声明之后,你把 Mul(x,y) 置于程序中,预处理器就会⽤下⾯这个表达式替换上⾯的表达式:++x*++y
a+b=3,b+c=5,++(a+b)*++(b+c)=++3 * ++5,即4 *6=24
大家是不是以为是这样的,但实际上,当我们使用编译器编译,我们会发现,最后的答案却为14,这是为什么呢?
其实真正的带入是这样子的:++a + b * ++b + c=2+3 * 3+3=14

在这里插入图片描述

对于上述关于预编译和编译的说法,我们可以逐一分析:
A: C语言由源代码生成的各阶段如下,C源程序-编译预处理-编译-优化程序-汇编程序-链接程序-可执行文件
这个说法是正确的。C语言源代码首先经过预处理器处理,包括宏替换、条件编译等;然后经过编译器编译成汇编代码;接着汇编器将汇编代码转换成机器代码;最后链接器将多个目标文件(包括库文件)链接成一个可执行文件。

B: 常见的预编译指令有#include,#define,#if、#else和#endif
这个说法也是正确的。这些确实是C语言中常见的预处理指令。

C: 编译程序可以识别一些特殊的符号,比如__LINE__ ,表示当前行号的整数,这些是在编译阶段处理的
这个说法不完全准确。__LINE__这样的预定义宏是在预处理阶段处理的,而不是编译阶段。预处理阶段会替换这些宏为相应的值(例如当前源代码行号)。

D: #define定义宏,可以多次使用
这个说法是正确的。#define是C语言中的预处理指令,用于定义宏,宏可以在代码中多次使用,并在预处理阶段被替换为其定义的值或表达式。

在这里插入图片描述

A: 预处理命令行必须使用分号结尾
这是不正确的。预处理命令行(如#include, #define等)后面不需要分号。分号是在C语言源代码中用来表示语句结束的,而预处理命令行并不是C语言的语句。

B: 凡是以#号开头的行,都被称为编译预处理命令行
这是正确的。在C语言中,任何以#开头的行都被视为预处理指令或预处理命令行。这些行在编译的预处理阶段被处理。

C: 预处理命令行不能出现在程序的最后一行
这是不正确的。预处理命令行可以出现在程序的任何位置,包括最后一行。只要它们是有效的预处理指令,编译器就会在预处理阶段对它们进行处理。

D: 预处理命令行的作用域是到最近的函数结束处
这也是不正确的。预处理命令行的作用域通常是全局的,它们在整个源文件中都有效,而不是仅限于最近的函数结束处。例如,使用#define定义的宏可以在整个源文件中使用,而不仅仅是定义它的那个函数。

在这里插入图片描述

在main函数开始执行时,a已经被定义为10,所以在main函数中的第一个printf语句会输出10…。

接下来调用foo函数。在foo函数中,a的原始定义(10)被#undef取消了,然后a被重新定义为50。但是,请注意,#undef和#define指令在foo函数中的修改不会影响到main函数中a的值,因为预处理器指令的修改是全局的,但是它们的修改在预处理阶段就已经确定,并且不会随着函数的调用而改变。

当foo函数返回后,main函数中的第二个printf语句继续执行,此时a的值仍然是10,因为在预处理阶段a的值就已经确定为10了,即使foo函数中进行了重新定义,也不会影响到main函数中a的值。

二、编程题

在这里插入图片描述

#include <stdio.h>

int main() {
	//首先把1~100000的值都存储到数组里,以便之后使用
    int a[100000] = {0};
    a[0] = 1;
    a[1] = 2;
    for (int i = 2; i < 100000; i++) {
        a[i] = 2 * a[i - 1] + a[i - 2];//这是数值规律
        a[i] %= 32767;//每次都模一个32767防止数值溢出
    }

    int n = 0;
    scanf("%d", &n);
    while (n--) {
        int k = 0;
        scanf("%d", &k);
        printf("%d\n", a[k - 1]);//因为数组从0下标开始
    }
    return 0;
}

在这里插入图片描述

方法一:用for循环

#include <stdio.h>
#include<string.h>

int main() {
    char arr[1000] = {0};
    int count_English = 0;
    int count_Space = 0;
    int count_Number = 0;
    int count_Else = 0;
    gets(arr);
    int len=strlen(arr);
    for(int i=0;i<len;i++) {
        if (arr[i] >= 'a' && arr[i]<= 'z' || arr[i] >= 'A' && arr[i] <= 'Z') {
            count_English++;
        }

        else if (arr[i] == ' ') {
            count_Space++;
        }

        else if (arr[i] >= '0' && arr[i] <= '9') {
            count_Number++;
        }

        else {
            count_Else++;
        }
    }
    printf("%d\n%d\n%d\n%d\n", count_English, count_Space, count_Number, count_Else);
    return 0;
}

方法二:用while循环

#include <stdio.h>
#include<string.h>

int main() {
    char arr[1000] = {0};
    char* p=arr;
    int count_English = 0;
    int count_Space = 0;
    int count_Number = 0;
    int count_Else = 0;
    gets(arr);
    while(*p) {
        if (*p >= 'a' && *p <= 'z' || *p >= 'A' && *p <= 'Z') {
            count_English++;
        }

        else if (*p == ' ') {
            count_Space++;
        }

        else if (*p >= '0' && *p <= '9') {
            count_Number++;
        }

        else {
            count_Else++;
        }
        p++;
    }
    printf("%d\n%d\n%d\n%d", count_English, count_Space, count_Number, count_Else);
    return 0;
}

两者的区别在于一个用指针,一个用数组下标,其实核心方法都是一个样子

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1503000.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker MySQL 报 2059 错误:认证插件 ‘caching_sha2_password‘ 无法加载

使用docker部署的mysql8.0.29再使用Navicat连接myslq报错Authentication plugin ‘xxxxxxx’ cannot be loaded&#xff1a;XXXXXX &#xff08;无法加载身份验证插件&#xff09; 原因&#xff1a;mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规…

实现QT中qDebug()的日志重定向

背景&#xff1a; 在项目开发过程中&#xff0c;为了方便分析和排查问题&#xff0c;我们需要将原本输出到控制台的调试信息写入日志文件&#xff0c;进行持久化存储&#xff0c;还可以实现日志分级等。 日志输出格式&#xff1a; 我们需要的格式包括以下内容&#xff1a; 1.…

【Java - 框架 - Mybatis】(01) 普通Java项目使用Mybatis操作Mysql - 快速上手

普通Java项目使用Mybatis操作Mysql - 快速上手 说明 通过软件"IntelliJ IDEA"创建"Maven"项目完成&#xff1b;通过"Mybatis"框架操纵"MySQL"数据库完成操作&#xff1b; 环境 Java版本"1.8.0_202"&#xff1b;Windows …

根据QQ号获取暗恋的人的全部歌单

文章目录 前言一、成果展示二、后端开发流程三、前后端障碍与难点解决四、待扩展内容五、总结 前言 本人喜欢使用QQ音乐听歌&#xff0c;并且喜欢点击好友栏目观看最近在听&#xff0c;了解暗恋的人最近在听什么歌曲&#xff0c;知己知彼&#xff0c;百战不殆。但是每次都需要…

Python数据分析实验一:Python数据采集与存储

目录 一、实验目的与要求二、实验过程三、主要程序清单和运行结果1、爬取 “中国南海网” 站点上的相关信息2、爬取天气网站上的北京的历史天气信息 四、程序运行结果五、实验体会 一、实验目的与要求 1、目的&#xff1a; 理解抓取网页数据的一般处理过程&#xff1b;熟悉应用…

JAVA实战开源项目:智能停车场管理系统(Vue+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容A. 车主端功能B. 停车工作人员功能C. 系统管理员功能1. 停车位模块2. 车辆模块3. 停车记录模块4. IC卡模块5. IC卡挂失模块 三、界面展示3.1 登录注册3.2 车辆模块3.3 停车位模块3.4 停车数据模块3.5 IC卡档案模块3.6 IC卡挂…

【python】异常处理

前言 省略各种废话&#xff0c;直接快速整理知识点 try-except 基础 作用 程序不可能永远都是对的&#xff0c;当7除a&#xff0c;a由用户输入时&#xff0c;用户输入0就会报错。try-except就是解决这些问题。 结构 多分支自定义错误类型 上方的exception是一个错误类型…

Unity性能优化篇(七) UI优化注意事项以及使用Sprite Atlas打包精灵图集

UI优化注意事项 1.尽量避免使用IMGUI(OnGUI)来做游戏时的UI&#xff0c;因为IMGUI的开销比较大。 2.如果一个UGUI的控件不需要进行射线检测&#xff0c;则可以取消勾选Raycast Target 3.尽量避免使用完全透明的图片和UI控件。因为即使完全透明&#xff0c;我们看不见它&#xf…

【牛客】HJ87 密码强度等级 CM62 井字棋

题目一:密码强度等级 题目链接&#xff1a;密码强度等级_牛客题霸_牛客网 (nowcoder.com) 本题主要考察C语言中逻辑分支语句&#xff0c;基本语句以及对各种特殊字符 &#xff0c;ASCII值以及条件表达中的逻辑运算符关系运算符各自功能的理解&#xff0c;以及基本使用&#x…

【linuxC语言】dup、dup2函数

文章目录 前言一、dup函数二、dup2函数三、将标准输出重定向到文件总结 前言 在Linux环境下&#xff0c;dup、dup2以及原子操作都是用于文件描述符管理和处理的重要工具。这些功能提供了对文件描述符进行复制和原子操作的能力&#xff0c;使得在多线程或多进程环境中更加安全和…

qt一个项目有且只有有一个maindow,其他小窗口用QWidget,QDialog是带有yes和no的QWidget

QMaindow QWidget QDialog区别很大 我想要在生成一个小窗口&#xff0c;结果选择基类为maindow&#xff0c;应该是QWidget 然后就出现奇奇怪怪的问题 QMaindow和QWidget不能乱选择&#xff0c;而且各自QPaintEvent也有很多区别 以下就是错误&#xff1a; 我继承maindow的基类…

C#,排列组合的堆生成法(Heap’s Algorithm for generating permutations)算法与源代码

1 排列组合的堆生成法 堆生成算法用于生成n个对象的所有组合。其思想是通过选择一对要交换的元素&#xff0c;在不干扰其他n-2元素的情况下&#xff0c;从先前的组合生成每个组合。 下面是生成n个给定数的所有组合的示例。 示例&#xff1a; 输入&#xff1a;1 2 3 输出&a…

【Qt】四种绘图设备详细使用

绘图设备有4个: **绘图设备是指继承QPainterDevice的子类————**QPixmap QImage QPicture QBitmap(黑白图片) QBitmap——父类QPixmapQPixmap图片类&#xff0c;主要用来显示&#xff0c;它针对于显示器显示做了特殊优化&#xff0c;依赖于平台的&#xff0c;只能在主线程…

python编程从入门到实践

python编程从入门到实践 if语句1.条件测试&#xff1a;2.更多的条件测试&#xff1a;3.外星人颜色#1&#xff1a;4. 外星人颜色#2&#xff1a;5. 外星人颜色#3&#xff1a;6. 人生的不同阶段&#xff1a;7. 喜欢的水果&#xff1a;8. 以特殊方式跟管理员打招呼&#xff1a;9. 处…

程序员失业,被迫开启 PlanB——成为自由职业/独立开发者的第 0 天

程序员失业&#xff0c;被迫开启 PlanB——成为自由职业/独立开发者的第 0 天 今天在逛V2EX的时候看到的一个帖子&#xff0c;程序员中年被裁&#xff0c;被迫开启独立开发这条路。 原贴如下&#xff1a; lastday, 失业啦 公司年前通知我合同到期不续签&#xff0c;今天是我…

React改变数据【案例】

State传统方式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>React Demo</title> <!--…

专业的项目管理系统,企智汇!帮助企业提高项目管理效率!

一款专业的项目管理系统&#xff0c;是企智汇项目管理系统&#xff01;企智汇专业做项目管理系统10年&#xff0c;经过10年的打磨&#xff0c;有成熟的项目管理系统功能&#xff0c;它面向各个企业的项目团队&#xff0c;提供数字化、智能化、信息化的项目管理功能&#xff0c;…

【亲测有效】解决三月八号ChatGPT 发消息无响应!

背景 今天忽然发现 ChatGPT 无法发送消息&#xff0c;能查看历史对话&#xff0c;但是无法发送消息。 可能的原因 出现这个问题的各位&#xff0c;应该都是点击登录后顶部弹窗邀请 [加入多语言 alapha 测试] 了&#xff0c;并且语言选择了中文&#xff0c;抓包看到 ab.chatg…

工作合同坑

1-不要给证件原件&#xff0c;给复印件&#xff0c;并写明用处 。 2-正式入职才填写详细的个人信息 3-入职的各种相关费用需要谨慎&#xff0c;注意是否合法正规 4-招转培是个坑 5-无薪试岗&#xff0c;滚 6-试用期工资不能低于转正之后的80%&#xff0c;一定要有纸质的正式工资…

LayerNorm的图是不是画错了

这是网上一张很流行的说明几个 Normalization 区别的图 这图出自Kaiming的文章 Group Norm 但是他这个 Layer Norm 的图是不是画错了? 我大四写毕设的时候就想问&#x1f923;&#x1f923;&#x1f923; 这都几年过去了 我觉得图应该是这样画的&#xff0c;相同颜色的区域…