有人可以解释为什么程序的输出是
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”。
仅供参考..我正在 VC++ 编辑器 Windows 7 32 位中编译程序。提前谢谢了。
有人可以解释为什么程序的输出是
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”。
仅供参考..我正在 VC++ 编辑器 Windows 7 32 位中编译程序。提前谢谢了。
大致:
要评估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这样编译器没有评估kor k++。剩余表达式:m=0||l++;
我希望你能做剩下的。:)
让我们将其分解为单独的操作:
i++ && j++:这将与 相同-1 && 0,即为假(即 0)。i然后分别j增加到0和1。0 && k++: 零来自上一个逻辑运算,结果为假,因为第一个运算符为假。k不会增加,因为逻辑运算符的快捷性质。0 || l: 零仍然来自先前的逻辑运算,它是0 || 2并且结果将为真,即1。l增加到3.m,现在变为真(即1)整个表达式导致i,增加,j并成为。只是你看到的结果。lm1
您的价值计算如下
m=((((i++)&&j++)&&k++)||l++);
因为所有 ++ 都是后增量,所以在计算 m 期间,所有变量的值都与您初始化的值相同,但在打印期间的下一行,它们都被递增。最后是 || 所以最终的 TRUE 将返回 m 的值。