目录
带有副作用的代码
带有副作用的宏参数
结论
带有副作用的代码
代码演示:
int a = 10;
int b = ++a;
副作用解析:
变量 a 在赋值给 b 之前 a 的值自增了1,那么 int b = ++a; 这条代码就带有副作用
带有副作用的宏参数
代码演示:
#define MAX(x,y) ((x)>(y)?(x):(y))
int main()
{
int a = 5;
int b = 6;
int max = MAX(a++, b++);
return 0;
}
代码解析:
解析 int max = MAX(a++, b++):根据 #define 的替换规则可得知,a++ 和 b++ 这两个参数是直接替换的,不会进行任何计算和转换,所以 MAX(a++, b++) 在程序预编译阶段就会转换为以下代码
int max = ((a++) > (b++) ? (a++) : (b++));
先执行 (a++) > (b++) ,且是后置加加,所以是先使用,再加加,a 的值是 5,b 的值是 6,是 b 大于 a
所以 (a++) : (b++) 中的 (a++) 就不会执行,执行完了 (a++) > (b++) 后,a 的值自增成了 6 ,b 的值自增成了 7
最后的结果是 max = (b++) ,也是先使用,后加加,b 的值为 7,所以 max 就为 7
最后 b 再自增 1,b就自增成了 8
代码验证:
结论
任何变量在宏中都是替换进去的,如果变量像是 a++ 或者 b++ 这种带有副作用,且在宏中不止执行一次的话,那么副作用的效果就会持续传递下去,所以尽量不要传递含有副作用的参数给宏