同时使用 && || 进行短路评估操作员

Short circuit evaluation with both && || operator

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

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

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

但是我卡在了这个问题上

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

这输出 0.

我的第一个想法是:

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

  1. ++x: evaluated.x 变为 1.

  2. 2 && ++x评价。计算两个操作数。

  3. ||被评价。

但是据此,应该打印1,而不是0

我的第二个想法是:

5 || anything

anything因为短路评估没有被评估,所以这里没有优先级。

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

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

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

运行次从左到右计算表达式5 || 2 && ++x

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

这就是为什么这里 x 将保持为 0。