我知道C中的短路评估是什么。
a && b
(如果a = 0则不检查操作数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
未被评估,因此这里没有优先权。
答案 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);
}