1、以下宏定义结果输出什么有没有什么问题怎么改进#define COMPUTER(X) X*5 int main() { int num1 3; int num2 5; int num COMPUTER(num1num2); printf(%d\n,num); return 0; }参考答案28分析本题答案容易踩坑误认为是 40实际上宏的本质上是文本替换num 35*528改进方案是#define COMPUTER(X) ( (X)*5 )2、下面的2段代码运行后会出现什么问题并简单分析原因//代码块1 char str[]hello; str[0]H; priontf(%s\n,str); //代码块2 char * str2hello; str2[0]H; printf(%s\n,str2);参考答案代码块1: 会输出 Hello分析定义一个字符数组变量通过所以修改首字符为H,所以会输出 Hello代码块2系统崩溃 会报错分析定义了一个字符指针并字符串常量的起始地址赋值给了字符指针由于是常量的地址内容是”只读的“不可修改强行修改会造成系统崩溃报错3、简单描述一下Volitale关键字在单片机种的应用参考答案回答这个问题需要先明白两个前提(1如何修改一个变量这个问题大多数同学都直到比如可以通过变量名去修改或者通过指针简介修改C种还允许通过引用去修改int num 90; num 100;//通过变量名修改num的值 printf(%d\n,num);//100 int *p num; *p 101;//通过指针修改变量的值 printf(%d\n,num);//101 int p_cite num; p_cite 102;//通过引用修改变量的值这是C中的语法 C中没有引用这个概念 printf(%d\n,num);//102但是无论是通过变量名修改还是指针修改亦或是引用修改归根结底都是软件修改还有一种修改变量的方式叫硬件修改之所以叫硬件修改是因为修改变量的值的操作由硬件完成软件无从控制但是软件可以查询修改后的结果(2)什么叫编译器优化编译器优化是指编译器为了提高编译效率通常会对代码进行优化比如如果编译器认为某个变量没有被修改,编译器就会把该变量放在缓存中每次读取的时候都从缓存中拿不从内存中拿这样可以提高变量的访问速度。这里“编译器认为某个变量没有被改变”是指没有被软件修改编译器只能识别软件修改识别不了硬件修改也就是说如果一个变量以编译器无法预知的方式修改(例如硬件修改编译器仍然会认为其值不会改变仍然会对齐进行优化这样就会出现问题。好了现在我们解释volatile关键字(1) 概念如果一个变量使用volitale关键字进行修饰意思是在高速编译器该变量可能会以你无法预知的方式修改(例如硬件修改)所以不要对齐进行优化不要从缓存中拿要从内存中拿才能保证数据的准确性。所以volatile关键字一般用来防止编译器优化。(2)应用一般硬件寄存器的访问经常使用voliatle关键字使用中断服务子程序中访问到的非自动变量推荐使用volatile修饰多线程任务中被几个任务共享的变量推荐使用vilatile修饰4、针对volitale关键字回答下面2个问题(1)一个变量可以既用const修饰又用volitale修饰吗参考答案是的可以分析这个问题看似相互矛盾实则是允许的大多数同学可能会觉得变量用const修饰就变成只读无法被修改而volatile关键字是高速编译器变量是易变的不要对齐优化看起来相互矛盾。实际上我们要剖开表面看本质变量使用const修饰变成只读不假但是这个只读仅仅是软件层面即不能通过变量名修改事实上它还可以通过指针间接修改或者是通过硬件方式修改volatile关键字是在告诉编译器变量可能会以其无法预知的方式改变(例如硬件修改)不要对其进行优化这样看就不矛盾了所以一个变量是可以同时被const 和 volitale关键字修饰的。2一个指针类型变量可以被volatile修饰吗参考答案可以volatile关键字的意思是告诉编译器该变量会以编译器无法预知的方式改变(例如硬件改变)不要对其进行优化并没有说必须是基本类型变量所以任何类型的变量都可以当然也包括指针类型。