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

pot*_*ato 0 c macros if-statement function

我从这个用C编写的宏函数中得到了一些奇怪的值

#define func(x, y) (x > y) ? y : x
Run Code Online (Sandbox Code Playgroud)

我认为相当于

int func(int x, int y) {
    if (x > y)
        return y;
    else
        return x;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我跑

int x = 10; 
int y = 9;
int z = func(x, y++); 

printf("x=%d, y=%d, z=%d\n", x, y, z);
Run Code Online (Sandbox Code Playgroud)

我得到x=10, y=11, z=10而不是x=10, y=10, z=9

知道这里发生了什么吗?

Mic*_*yan 5

宏只是一个文本扩展.那是:

func(x, y++)
Run Code Online (Sandbox Code Playgroud)

替换为:

(x > y++) ? y++ : x
Run Code Online (Sandbox Code Playgroud)

......当它是一个宏.相比之下,当它是一个函数时,参数被评估一次,如:

 int implicit_arg0 = x;
 int implicit_arg1 = y++;
 push implicit_arg0
 push implicit_arg1
 jump to address of "func"
Run Code Online (Sandbox Code Playgroud)

...导致y在函数版本中仅增加一次,在宏中增加两次.