有人可以解释为什么程序的输出是
0 1 1 3 1
void main(void)
{
int i=-1,j=0,k=1,l=2,m;
m=i++&&j++&&k++||l++;
printf("%d %d %d %d %d",i,j,k,l,m);
}
主要关注的是“为什么k不会增加”。
FYI ..我正在用VC ++编辑器Windows 7 32位编译程序。 非常感谢提前。
答案 0 :(得分:7)
大致是:
要评估i++&&j++
,编译器首先评估i
。结果是-1
。 -1
存储在临时变量中。然后i
增加了。
由于-1
不为零,编译器评估j
,即0
。编译器现在评估-1 && 0
,即0
。然后j
增加了。
此时,i = 0
和j = 1
。剩下的表达:m=0&&k++||l++;
为了评估0&&k++
,编译器注意到第一个操作数是0
。结果必须为0
,因此编译器不会评估k
或k++
。剩下的表达:m=0||l++;
我希望你能完成剩下的工作。 :)
答案 1 :(得分:4)
让我们将其分解为单独的操作:
i++ && j++
:这与-1 && 0
相同,为假(即0)。i
和j
分别增加到0
和1
。0 && k++
:零来自上一个逻辑操作,结果为假,因为第一个操作符为false。k
不增加。0 || l
:零仍然来自上一个逻辑操作,它是0 || 2
,结果将为真,即1
。l
增加到3
。m
,现在变为真(即1
)整个表达式会导致i
,j
和l
增加,m
变为1
。只是你看到的结果。
答案 2 :(得分:1)
您的价值计算如下
m=((((i++)&&j++)&&k++)||l++);
因为所有的++都是后递增的,所以在计算m时,所有变量都具有与初始化相同的值,但在打印期间的下一行,它们都会递增。最后是||所以最终的TRUE将返回到m的值。