不了解陈述

时间:2018-11-26 07:45:03

标签: c

这是代码

int main()
{
    int i=-3, j=2, k=0, m;
     m = ++i||++j&&++k;
     printf("%d, %d, %d, %d\n", i, j, k, m);
     return 0;
}

并输出: -2、2、0、1

但是我不明白m = ++i||++j&&++k;行是如何执行的。 有人请解释。谢谢!

2 个答案:

答案 0 :(得分:6)

最初,您有4个变量:

  • i = -3
  • j = 2
  • k = 0
  • m未初始化

m = ++i||++j&&++k;从左到右执行。所以第一个是++i-我建议阅读有关differences between i++ and ++i的信息-在这种情况下,i增加1并成为i = -2

-2是true表达式,因此m变为1,并且不对该表达式的其余部分求值。因为无论如何true or anything else始终为真。 所以最终结果:

  • i = -2(增加)
  • j = 2(不变)
  • k = 0(不变)
  • m是1(真)

答案 1 :(得分:2)

逻辑OR操作(expr1 || expr2)采用short-circuiting行为。也就是说,如果expr2是逻辑expr1 1,则不会评估(true)

如果两个操作数中的任何一个都不为零,则具有逻辑OR运算符的表达式的求值为true

在此表达式中:

m = ++i||++j&&++k;
    |_|  |______|
    LHS    RHS

i-3初始化。 ++i将得出-2
-2是一个非零值,因此求值为逻辑true,并且表达式的RHS部分将不求值。

由于整个表达式的求值为true,因此将值1分配给m