在下面的代码中,根据我的说法,输出应该是 11 6 10
,但它给出 12 6 11
。 k=x
的值自 x>y
起由三元运算符返回哪里x=10
和y=6
,所以i=11
, j=6
和k=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);
i
和 j
都会随着条件的计算而递增(因此 i
变为 11
和 >j
变为 6
。因为条件检查了 i
的原始值以及 j
和 10 的增量值> 6
,?
后的 i++
被求值,因此 k
被赋值为 11
和 i
增加到 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/