面试题答案
一键面试- 分析输出结果:
- 宏定义
#define INC(x) (++x)
会在预处理阶段进行文本替换。 - 对于
int value1 = INC(num) + INC(num);
,预处理后变为int value1 = (++num) + (++num);
。 - 假设
num
初始值为5
,先执行第一个++num
,num
变为6
,再执行第二个++num
,num
变为7
,最后计算6 + 7
,value1
的值为13
,num
的最终值为7
。
- 宏定义
- 宏定义替换机制带来的副作用及可能导致的错误:
- 副作用:
- 宏定义是简单的文本替换,不会像函数那样对参数进行求值隔离。在
(++num) + (++num);
中,num
被多次自增,这可能与程序员预期不符,因为从int value1 = INC(num) + INC(num);
表面上看,像是对num
进行两次不同的操作,但实际上num
被连续自增。
- 宏定义是简单的文本替换,不会像函数那样对参数进行求值隔离。在
- 可能导致的错误:
- 可移植性问题:不同编译器对表达式中多个自增操作的处理顺序可能不同。虽然在大多数常见编译器中,自左向右处理,但这并不是标准规定的。所以这段代码在不同编译器上可能有不同的行为,导致程序在不同平台上运行结果不一致。
- 调试困难:由于宏定义在预处理阶段就被替换,调试时看到的代码和实际执行的代码在形式上有差异。当程序出现错误时,难以直接从源程序中定位问题,因为实际执行的是经过宏替换后的代码。
- 副作用: