C 宏函数 If...Else 值

标签 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

知道这里发生了什么吗?

最佳答案

宏只是文本扩展。即:

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 在函数版本中仅递增一次,在宏中递增两次。

关于C 宏函数 If...Else 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35499953/

相关文章:

python - 具有优先级/顺序的循环

Swift - 编写 if else 的最佳方式

c++ - strcat 目标数组的大小

c - 多线程中使用的套接字?

C 将 char 视为字母,而不是单字节整数

python - 如何在Python中为RC电路创建传递函数

Linux Bash函数条件执行用户输入

c - 从二进制文件读取数据到 C 结构中的访问冲突

C - 带有函数指针的结构体,如何修复 "variable number of arguments"警告?

c# - 为什么嵌套 if 语句可以工作,但 "&&"运算符却不能? (字母计数脚本)