2

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

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 位中编译程序。提前谢谢了。

4

3 回答 3

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这样编译器没有评估kor k++。剩余表达式:m=0||l++;

我希望你能做剩下的。:)

于 2013-05-15T09:36:52.653 回答
4

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

  1. i++ && j++:这将与 相同-1 && 0,即为假(即 0)。
  2. i然后分别j增加到01
  3. 0 && k++: 零来自上一个逻辑运算,结果为假,因为第一个运算符为假。
  4. k不会增加,因为逻辑运算符的快捷性质。
  5. 0 || l: 零仍然来自先前的逻辑运算,它是0 || 2并且结果将为真,即1
  6. l增加到3.
  7. 逻辑运算的结果分配给m,现在变为真(即1

整个表达式导致i,增加,j并成为。只是你看到的结果。lm1

于 2013-05-15T09:31:08.863 回答
1

您的价值计算如下

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

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

于 2013-05-15T09:33:19.697 回答