C宏功能如果......其他值

时间:2016-02-19 07:42:30

标签: c function if-statement macros

我从这个用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

知道这里发生了什么吗?

2 个答案:

答案 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。 希望有所帮助。