《C和指针》——带副作用的宏参数

来源:互联网 发布:淘宝有趣搜索血滴子 编辑:程序博客网 时间:2024/06/03 15:56

先看一段程序

#include <stdio.h>#define MAX(a,b) {(a)>(b)?(a):(b)}int main(){    int x = 5;    int y = 8;    int z = MAX(x++, y++);    printf("x=%d, y=%d, z=%d\n", x, y, z);    return 0;}

这个打印的是什么?
结果是:x=6,y=10,z=9。
其实x和z的结果没什么奇怪的,主要是y的结果
和往常一样,只要检查二下用宏替换后产生的代码,这个奇怪的结果就变得一日了然了。

z = ( ( x++ ) > ( y++ ) ? ( x++ ) : ( y++ ) );

虽然那个较小的值只增值了一次,但那个较大的值却增值了两次一一第1 次是在比较时,第2次在执行?符号后面的表达式时出现。

0 0