使用&& ||进行短路评估 操作者
我知道什么是C中的短路评估。
a && b
(如果a = 0,则不检查操作数b)
a || b
a || b
(如果a =非零,则不检查操作数b)
但是我坚持这个问题
int x = 0; if (5 || 2 && ++x) printf("%d", x);
输出0
。
我的第一个想法如下:
根据优先级表,优先级是++
, &&
, ||
(降序排列)
-
++x
:evaluated.x
成为1。 -
2 && ++x
评估。 两个操作数都被评估。 -
||
被评估。
但据此,应该打印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); }