C语言使用#define定义max类函数宏后代码输出5的原因是什么
结果产生原理
首先你要明确C语言的类函数宏是预编译阶段的纯文本替换,不会像普通函数一样先计算完参数值再传入,而是直接把你写的参数原文代入到宏定义的位置。
你给出的代码里,max(++i,++j) 经过预编译替换后,实际展开的代码等效于:
k = (++i > ++j ? ++i : ++j);
接下来按顺序执行逻辑:
- 初始值:
i=2,j=3 - 先计算三元运算符的判断条件
++i > ++j:- 执行
++i,i自增为3 - 执行
++j,j自增为4 3>4的判断结果为假,所以取冒号后面的++j执行
- 执行
- 第二次执行
++j,j自增为5,赋值给k
所以最终printf输出的k值就是5。
这也是类函数宏最常见的坑:如果参数带副作用(比如自增、自减、函数调用),会因为多次展开被执行多次,和普通函数的行为完全不同,写宏的时候要特别注意规避这类问题。
内容的提问来源于stack exchange,提问作者Md Masuduzzaman
相关产品推荐
相关产品推荐

