宏中参数的意外多重评估
为什么第二个printf的输出是:最大50和67是62? 为什么不是50和62的最大值是57?
#define MAX(a,b) ((a)>(b) ? (a): (b)) int incr(){ static int i =42; i += 5; return i; } int _tmain(int argc, _TCHAR* argv[]) { int x = 50; printf("max of %d and %d is %d\n",x, incr(), MAX(x, incr())); printf("max of %d and %d is %d",x, incr(), MAX(x, incr())); return 0; }
printf("max of %d and %d is %d\n",x, incr(), MAX(x, incr()));
宏替换后,它变为:
printf("max of %d and %d is %d\n",x, incr(), ((x)>(incr()) ? (x): (incr()))); // ^1 ^2 ^3
在这个单个函数调用中多次调用incr()
,未指定首先计算哪个参数。 无论第一个还是第二个被调用,都会使结果出乎意料。
唯一可以确定的是由于?:
, (x)>(incr()
的短路(x)>(incr()
评估(x)>(incr()
以确定表达式是否具有值(x)
或第三个值是否为incr()
。