我从这个用C
编写的宏函数中得到了一些奇怪的值#define func(x, y) (x > y) ? y : x
我认为相当于
int func(int x, int y) {
if (x > y)
return y;
else
return x;
}
然而,当我跑
时int x = 10;
int y = 9;
int z = func(x, y++);
printf("x=%d, y=%d, z=%d\n", x, y, z);
我得到x=10, y=11, z=10
而不是x=10, y=10, z=9
知道这里发生了什么吗?
答案 0 :(得分:5)
宏只是文本扩展。那就是:
func(x, y++)
替换为:
(x > y++) ? y++ : x
...当它是一个宏。相反,当它是一个函数时,参数将被评估一次,如:
int implicit_arg0 = x;
int implicit_arg1 = y++;
push implicit_arg0
push implicit_arg1
jump to address of "func"
...导致y在函数版本中仅增加一次,在宏中增加两次。
答案 1 :(得分:1)
这是因为宏将被评估为(x> y ++)?y ++:x 10> 9的编码是真的,因此它将返回y ++(但是因为在检查条件10> 9y之后将y增加到10,因此y的值将是10)并且在返回10之后它将增加到11。 希望有所帮助。