c - 下面的代码中宏扩展如何工作?

标签 c

在下面的代码中,根据我的说法,输出应该是 11 6 10 ,但它给出 12 6 11k=x的值自 x>y 起由三元运算符返回哪里x=10y=6 ,所以i=11 , j=6k=10 ,那么为什么产生的输出不匹配呢?

#include <stdio.h>

#define MAX(x,y)(x)>(y)?(x):(y)

int main()
{
    int i=10,j=5,k=0;
    k=MAX(i++,++j);
    printf("%d %d %d",i,j,k);
    return 0;
}

最佳答案

展开相当于:

k = (i++) > (++j) ? (i++) : (++j);

ij 都会随着条件的计算而递增(因此 i 变为 11 >j 变为 6。因为条件检查了 i 的原始值以及 j10 的增量值> 6? 后的 i++ 被求值,因此 k 被赋值为 11i 增加到 12。

因此输出应该是:

12 6 11

这里没有未定义的行为。条件评估后有一个完整的序列点。

还要注意,为了完全安全,宏应该在扩展周围有一组额外的括号:

#define MAX(x,y)  ((x) > (y) ? (x) : (y))

否则,您会得到奇怪的效果:

int l = 7 * MAX(k, i) + 3;

它有效;它只是没有按预期工作。

关于c - 下面的代码中宏扩展如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38549422/

相关文章:

c - 换入换出页面后,使用页映射表访问物理地址的过程是什么

c++ - 输出文件缺少位图文件末尾的填充。为什么是这样?

c - 为什么 "int x = 5; printf("%d %d %d", x==5, x=10, x==5) ;"in C print "0 10 0"?

c - c中的重入函数是什么?

c - 为什么这个排序功能不起作用? C

c - 在 pthreads 中实现 FIFO 互斥锁

C (WinAPI) - 获取互联网文件的大小

计算C中的一系列字符

c - 结构体指针参数

c++ - 在 Linux 上管理共享库的常用方法是什么?