5

可能重复:
why “++x || ++y && ++z” calculate “++x” firstly ? however,Operator “&&” is higher than “||”优先逻辑运算符的

如果你看看C'S优先顺序表,你会看到& &比||更高的优先级。

但是看看下面的代码:

a=b=c=1; 

++a || ++b && ++c; 

printf("%d %d %d\n",a,b,c); 

它打印出“2 1 1”,这意味着“++一个”先评估,一旦程序看到一个真正有它在那里停留,因为||的另一边是什么并不重要。

但由于& &的优先级高于||,不应“++ b & & ++ C”被首先计算,然后将结果插回“++一个||结果”? (在这种情况下,程序将打印“1 2 2”)。

+0

是的,我没有明白。感谢您的高举。 –

回答

13

只是尽量用括号想象它:

++a || ++b && ++c; 

等于

(++a) || (++b && ++c); 

从左至右被评估。

如果& &和||将具有相同的优先级,它看起来像

(++a || ++b) && (++c); 
+0

很好的解释,谢谢。 –

0

&& has higher precedence只在解析树。但是,编译器优化代码

if(!++a) { 
    ++b && ++c; 
} 
+0

这不是一个优化。 –

+0

你如何更好地称呼它呢?没关系。 –

+0

短路是一种“优化”的想法是一次又一次出现在SO上的误解。在很多情况下,**不是**短路就是优化。例如,'++ a | ++ b'(无分支)的计算几乎肯定比'++ a || ++ b'(条件分支)便宜。重要的是要意识到短路不是可选行为,结果是不同的。 –

6

优先级规则只能说,它会像这样进行评估:

++a || (++b && ++c); 

现在到了逻辑运算符的短路行为,这表示,你必须评估从左到右的条款,并在结果已知时停止。右侧的部分永远不会被执行。

+0

Gotcha。你能给我一个例子,其中&&优先于||会很重要吗?谢谢 –

+0

这里很重要。如果它们具有相同的优先级,或者如果'||'具有更高的优先级,则它将被评估为'(++ a || ++ b)&& ++ c',所以'++ a'和'++ c'将被评估。 –

+0

好点。谢谢。 –

0

你举的例子++a || ++b && ++c相同++a || (++b && ++c)

2

评价的先后顺序和顺序是两个完全不同的东西。对于逻辑运算符表达式,评估总是从左到右。表达++a || ++b && ++c被解释为

  1. 评估++一个
  2. 如果1的结果是零,评估++ b & & ++Ç

表达是解析作为++a || (++b && ++c) ;如果子表达式++a++b && ++c中的任一个为真,则整个表达式为真。

+0

呃,是的我的困惑是假设优先顺序也影响了评估顺序。 –