使用&& ||进行短路评估 操作者

use*_*632 4 c short-circuiting

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

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

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

但我坚持这个问题

int x = 0;
if (5 || 2 && ++x)
    printf("%d", x);
Run Code Online (Sandbox Code Playgroud)

这输出0.

我的第一个想法如下:

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

  1. ++x:evaluated.x变成1.

  2. 2 && ++x评估.两个操作数都被评估.

  3. || 被评估.

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

我的第二个想法是:

5 || anything
Run Code Online (Sandbox Code Playgroud)

anything 由于短路评估没有评估,因此这里没有优先权.

Him*_*shu 7

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

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

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

这就是为什么x将保持为0的原因.