C语言中逻辑运算符的优先级

Dan*_*cco 5 c operator-precedence logical-operators

可能重复:
为什么"++ x || ++ y && ++ z"计算"++ x"首先?但是,运算符"&&"高于"||"

如果你看一下C的优先级表,你会发现&&的优先级高于||.

但是看看下面的代码:

a=b=c=1;

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

printf("%d %d %d\n",a,b,c);
Run Code Online (Sandbox Code Playgroud)

它打印出"2 1 1",这意味着首先评估"++ a",一旦程序看到TRUE,它就会停在那里,因为在||的另一边是什么 并不重要.

但由于&&的优先级高于||,因此不应首先评估"++ b && ++ c",然后将结果插回"++ a || result"?(在这种情况下,程序将打印"1 2 2").

hel*_*s35 13

试着用括号想象它:

++a || ++b && ++c;
Run Code Online (Sandbox Code Playgroud)

等于

(++a) || (++b && ++c);
Run Code Online (Sandbox Code Playgroud)

从左到右进行评估.

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

(++a || ++b) && (++c);
Run Code Online (Sandbox Code Playgroud)


Kar*_*ath 6

优先规则只表示它将按如下方式进行评估:

++a || (++b && ++c);
Run Code Online (Sandbox Code Playgroud)

现在出现了逻辑运算符的短路行为,它表示您必须从左到右计算项,并在结果已知时停止.右边的部分永远不会被执行.