用&&和& ||操作者

时间:2016-04-27 03:48:06

标签: c short-circuiting

我知道C中的短路评估是什么。

a && b(如果a = 0则不检查操作数b)

a || b(如果a =非零,则不检查操作数b)

但我坚持这个问题

int x = 0;
if (5 || 2 && ++x)
    printf("%d", x);

这会输出0

我的第一个想法如下:

根据优先级表,优先级为++&&||(降序)

  1. ++xevaluated.x变为1。

  2. 2 && ++x进行了评估。两个操作数都被评估。

  3. ||已经过评估。

  4. 但根据这一点,我应该打印1,而不是0

    我的第二个想法是:

    5 || anything
    
    由于短路评估,

    anything未被评估,因此这里没有优先权。

2 个答案:

答案 0 :(得分:6)

由于运算符优先级,表达式5 || 2 && ++x相当于5 || (2 && ++x)

运行时从左到右评估表达式5 || 2 && ++x

正如我们在 OR 中所知,如果第一个条件为真,则不会检查第二个条件 所以这里5被评估为真,因此(2 && ++x)将不会被执行。

这就是为什么x在这里保持为0的原因。

答案 1 :(得分:2)

正确。表达被短路了。你可以用它来测试它。

if(5 || ++x) {
  printf("%d\n",x);
}