C运算符优先级,增量后编程问题

时间:2013-05-15 09:23:06

标签: c operators post-increment operator-precedence

有人可以解释为什么程序的输出是

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位编译程序。 非常感谢提前。

3 个答案:

答案 0 :(得分:7)

大致是:

要评估i++&&j++,编译器首先评估i。结果是-1-1存储在临时变量中。然后i增加了。

由于-1不为零,编译器评估j,即0。编译器现在评估-1 && 0,即0。然后j增加了。

此时,i = 0j = 1。剩下的表达:m=0&&k++||l++;

为了评估0&&k++,编译器注意到第一个操作数是0。结果必须为0,因此编译器不会评估kk++。剩下的表达:m=0||l++;

我希望你能完成剩下的工作。 :)

答案 1 :(得分:4)

让我们将其分解为单独的操作:

  1. i++ && j++:这与-1 && 0相同,为假(即0)。
  2. 然后
  3. ij分别增加到01
  4. 0 && k++:零来自上一个逻辑操作,结果为假,因为第一个操作符为false。
  5. 由于逻辑运算符的快捷性,
  6. k 增加。
  7. 0 || l:零仍然来自上一个逻辑操作,它是0 || 2,结果将为真,即1
  8. l增加到3
  9. 逻辑操作的结果已分配给m,现在变为真(即1
  10. 整个表达式会导致ijl增加,m变为1。只是你看到的结果。

答案 2 :(得分:1)

您的价值计算如下

m=((((i++)&&j++)&&k++)||l++); 

因为所有的++都是后递增的,所以在计算m时,所有变量都具有与初始化相同的值,但在打印期间的下一行,它们都会递增。最后是||所以最终的TRUE将返回到m的值。