C中预增量运算符的意外行为

时间:2013-12-26 06:38:19

标签: c

   #include <stdio.h>
    void main()
    {
      int i = -3, j=2, k=0, m;
      m=  ++i|| ++j && ++k; 
      printf("%d%d%d%d", i, j, k, m);
    }

如果我们在++i|| ++j && ++k;中看到评估顺序,我们首先会对++j && ++k进行评估,它会增加j和k的值,之后它将评估为1 ++i || 1会评估哪个会增加i的值并将1分配给m,所以输出应该是-2 3 1 1但是它给出了输出-2 2 0 1我想我在这里缺少一些概念。

4 个答案:

答案 0 :(得分:4)

||&&是短路运营商。如果没有必要确定输出,它们不会计算第二个操作数。

这里,++i求值为非零值,在布尔上下文中为true。根本没有对右侧进行评估。

答案 1 :(得分:3)

由于运算符||&&已进行短路评估,因此++i评估为true后,++j++k将不会被评估。因此,jk保持不变。

答案 2 :(得分:1)

逻辑运算符始终从左到右进行评估。这些运算符称为短路运算符,即如果表达式的值可以仅从左操作数的值推导出,则不评估右操作数。由于此处i不为零,因此永远不会评估++j && ++k,因此不会对jk进行任何修改。
运算符优先级与评估顺序无关。不要混淆。

答案 3 :(得分:0)

从第一次开始,

m将等于1,首先评估 OR 条件,并且由于++ i非零,您将得到

m=1

由于OR语句本身的第一部分是 true ,因此不评估第二部分。因此,您的j和k值将保持不变