12. C语言&数据结构与算法(99道)***1***

1.预处理&关键字(22道)

1.1宏定义是在编译的哪个阶段被处理的?

答案:宏定义是在编译预处理阶段被处理的。

解读:编译预处理:头文件包含、宏替换、条件编译、去除注释、添加行号。

1.2写一个标准MIN,这个宏输入两个参数并返回较小的一个。 

答案:

#define  MIN(A, B)  ((A) <= (B)? (A) : (B))   

解读:

(1)注意这个题目要用三重条件操作符,在宏中要小心地把参数用括号括起来,并且整个宏也要用括号括起来,防止替换时出现错误。

(2)注意若写“least = MIN(*p++, b);”这句代码会产生副作用,将*p++代入宏体,指针p会做两次自增操作。


1.3已知数组table,用宏求数组元素个数。

答案:

#define  COUNT(table)  (sizeof(table) / sizeof(table[0]))  

解读:sizeof(table)得到数组长度,sizeof(table[0])得到数组元素长度,两者相除即可得到数组元素个数。


1.4带参宏和函数的区别?

(1)带参宏只是在编译预处理阶段进行简单的字符替换;而函数则是在运行时进行调用和返回。

(2)宏替换不占运行时间,只占编译时间;而函数调用则占运行时间(分配单元、保留现      场、值传递、返回)。

(3)带参宏在处理时不分配内存;而函数调用会分配临时内存。

(4)宏不存在类型问题,宏名无类型,它的参数也是无类型的;而函数中的实参和形参都要定义类型,二者的类型要求一致。

(5)而使用宏定义次数多时,宏替换后源程序会变长;而函数调用不使源程序变长。


1.5内联函数的优缺点和适用场景是什么?

(1)优点:内联函数与宏定义一样会在原地展开,省去了函数调用开销,同时又能做类型检查。

(2)缺点:它会使程序的代码量增大,消耗更多内存空间。

(3)适用场景:函数体内没有循环(执行时间短)且代码简短(占用内存空间小)。


1.6关键字volatile的作用是什么?给出三个不同的例子。
(1)作用:告诉编译器不要去假设(优化)这个变量的值,因为这个变量可能会被意想不到地改变。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
(2)例子: 

①并行设备的硬件寄存器(如:状态寄存器)。

②一个中断服务子程序中会访问到的非自动变量。

③多线程应用中被几个线程共享的变量(防止死锁)。


1.7如何用C语言实现读写寄存器变量?

答案:

#define  rBANKCON0  (*(volatile unsigned long *)0x48000004)  
rBANKCON0 = 0x12;  

解读:

(1)由于是寄存器地址,所以需要先将其强制类型转换为 ”volatile unsigned long *”

(2)由于后续需要对寄存器直接赋值,所以需要解引用。


1.8下面代码能不能编译通过?

#define c 3  
c++;  

答案:不能。

解读:自增运算符++用于变量,3是常量。


1.9“在C语言中,凡是以#开头的都是预处理命令,同时预处理命令都是以#开头的”,这句话是正确的吗?

正确。


1.10预处理器标识#error的作用是什么? 

答案:编译程序时,只要遇到 #error 就会跳出一个编译错误。

解读:当程序比较大时,往往有些宏定义是在外部指定的(如makefile),或是在系统头文件中指定的,当你不太确定当前是否定义了 XXX 时,可写如下预处理代码:

#ifdef XXX  
#error "XXX has been defined"  
#else  
…  
#endif  

这样,如果编译时出现错误,输出了XXX has been defined,表明宏XXX已经被定义了。


1.11用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)。
答案:
#define  SECONDS_PER_YEAR  (60 * 60 * 24 * 365)UL 

解读:
(1)注意预处理器将为你计算常数表达式的值,并且整个宏体要用括号括起来。

(2)注意这个表达式将使一个16位机的整型数溢出,因此要用到无符号长整型符号UL

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

包含241道笔试面试真题详解,还有岗位及校招介绍,简历制作、笔试准备、面试准备的经验分享,以及嵌入式软件工程师技能树解读。你想知道的所有关于嵌入式求职的问题,几乎都可以在这里找到答案。 订阅即赠送学习笔记、简历模板、面试提纲模板、内推机会,需要的同学点击我头像私信即可!

全部评论
总结的很全面,蛮有帮助的✧ʕ̢̣̣̣̣̩̩̩̩·͡˔·ོɁ̡̣̣̣̣̩̩̩̩✧
1 回复 分享
发布于 2021-03-24 13:35
解答很详细!
1 回复 分享
发布于 2021-01-05 15:48
宏替换是在预处理阶段进行的,而不是在编译阶段。C语言的编译过程通常包括以下几个主要阶段: 预处理(Preprocessing):在此阶段,预处理器会根据源代码中的预处理指令,如宏定义(#define)、文件包含(#include)等,对源代码进行相应的文本替换和操作,生成经过预处理的代码。 编译(Compiling):在编译阶段,编译器将经过预处理的代码转换为汇编代码,这些汇编代码使用特定的汇编语言表示,具体规则取决于所使用的编译器。 汇编(Assembling):在汇编阶段,汇编器将汇编代码翻译为机器代码,即可执行的二进制指令。 链接(Linking):最后一步是链接阶段,链接器将各个编译单元(如源代码文件、库文件等)的机器代码组合在一起,解决符号引用,生成最终的可执行文件或共享库。 因此,在此整个编译过程中,宏替换发生在预处理阶段,是在编译之前进行的操作。
1 回复 分享
发布于 2023-07-17 15:52 河北
1.14(2)和三有错别字和少字
1 回复 分享
发布于 2022-08-19 14:58 广东
想问一下应用编程与网络编程那张的知识点有什么书推荐吗?
1 回复 分享
发布于 2021-04-26 15:29
我新手入村😭请问要怎么在牛客刷题,还是说可以跟着博主掌握这些题目的知识点就可以了
点赞 回复 分享
发布于 2024-02-03 21:35 广东
宏替换占用的是预处理的时间,不是编译的时间。 预处理-编译-汇编-链接
点赞 回复 分享
发布于 2023-03-09 00:43 湖南
扫一眼觉得不难,仔细看很多答不上来。要是有pdf就更好了,打印出来勾勾画画。
点赞 回复 分享
发布于 2023-03-08 09:22 吉林
{"pureText":"volatile防止死锁吗?不应该是防止脏读嘛"}
点赞 回复 分享
发布于 2022-11-02 19:12 江苏
预处理有添加行号嘛?作用是什么?
点赞 回复 分享
发布于 2022-05-03 16:37
可点击网址直达https://www.nowcoder.com/discuss/585617
点赞 回复 分享
发布于 2021-06-29 21:43
MTK联发科22届校招提前批招聘来啦,全球第四IC设计公司,给你大厂薪资及工作体验。 岗位:软件类、硬件类、IC类、算法类、测试类 地点:北京、上海、深圳、成都、合肥、武汉 点击链接即可投递简历 http://mediatek-campus.zhaopin.com/job2.html 内推码:AGNCMQ ⚠️内推码填写方式: “是否为内部推荐”选择“是”,“填写推荐人姓名+城市”那里直接填内推码。
点赞 回复 分享
发布于 2021-06-18 00:00
知识点很全面!帮助不小
1 回复 分享
发布于 2021-03-14 18:43
解答详细!
点赞 回复 分享
发布于 2021-03-08 02:47
老哥,定义秒数这个宏因为UL编译不过,我用c++要放到括号里面才可以.
点赞 回复 分享
发布于 2021-02-26 22:34

相关推荐

03-28 19:11
铜陵学院 C++
有礼貌的山羊追赶太阳:太典了,连笔试都没有开始就因为HC满了而结束了,而且还卡你不让你再投其他部门的。
点赞 评论 收藏
分享
评论
11
6
分享

创作者周榜

更多
牛客网
牛客企业服务