C 中逻辑运算符的优先级
可能重复:
为什么“++ x || ++ y && ++ z“计算”++ x“首先? 但是,运算符“&&”高于“||”
如果你看一下C的优先级表,你会发现&&的优先级高于||。
但请看下面的代码:
a=b=c=1; ++a || ++b && ++c; printf("%d %d %d\n",a,b,c);
它打印出“2 1 1”,这意味着首先评估“++ a”,一旦程序看到TRUE,它就会停在那里,因为在||的另一边是什么 并不重要。
但由于&&的优先级高于||,所以不应首先评估“++ b && ++ c”,然后将结果插回“++ a || result”? (在这种情况下,程序将打印“1 2 2”)。
试着用括号想象它:
++a || ++b && ++c;
等于
(++a) || (++b && ++c);
从左到右进行评估。
如果&&和|| 它会有相同的优先级,看起来像
(++a || ++b) && (++c);
优先规则只表示它将按如下方式进行评估:
++a || (++b && ++c);
现在出现了逻辑运算符的短路行为,它表示你必须从左到右评估术语,并在结果已知时停止。 右边的部分永远不会被执行。
评价的优先顺序和顺序是两个完全不同的东西。 对于逻辑运算符表达式,评估始终是从左到右。 表达式++a || ++b && ++c
++a || ++b && ++c
被解释为
- 评估++ a
- 如果1的结果为零,则评估++ b && ++ c
表达式被解析为++a || (++b && ++c)
++a || (++b && ++c)
; 如果子表达式++a
或++b && ++c
任何一个为真,则整个表达式为真。
&& has higher precedence
仅在解析树中&& has higher precedence
。 但编译器将代码优化为
if( !++a ) { ++b && ++c; }
你的例子++a || ++b && ++c
++a || ++b && ++c
与++a || (++b && ++c)
相同 ++a || (++b && ++c)
。