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

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

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

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

但是我坚持这个问题

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

输出0

我的第一个想法如下:

根据优先级表,优先级是++&&|| (降序排列)

  1. ++xevaluated.x成为1。

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

  3. || 被评估。

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

我的第二个想法是:

 5 || anything 

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

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

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

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

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

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

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