【发布时间】:2019-03-16 15:33:49
【问题描述】:
#include<stdio.h>
void main()
{
int x=3,y=2,z=0,m;
m=++x || ++y && ++z;
printf("\n %d %d %d %d\n",x,y,z,m); // 4 2 0 1
}
以下代码的输出在程序中作为注释被提及,我正在尝试评估这个答案是如何产生的,但我无法理解。
我只是想知道程序是如何计算相对值的。
【问题讨论】:
-
++x的值为 4(并将 4 分配给x作为副作用)。4 || <anything>的值为1并且不计算<anything>。所以你的m得到1,你的x得到4,你的其他变量没有改变。 -
而这段代码不能用在严肃的程序中。
-
基本上,如果
||的左侧操作数的计算结果为真,则右侧的所有内容都将被忽略。所以你不妨写m = ++x || y++ + ++y / 0 + *(int*)NULL;,它会工作得很好,因为||右侧的所有错误都被忽略了。 -
@Lundin:即使在隐藏的结构后面,
y++ + ++y仍然是 UB。编译器本身会对此感到厌烦:)
标签: c operators logical-operators