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被解释为

  1. 评估++ a
  2. 如果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)