#include <stdio.h>
int main(void) {
int i = -3, j = 2, k = 0, m;
m = ++i && ++j || ++k;
printf("%d %d %d %d\n",i,j,k,m);
return 0;
}
我正在尝试了解C中运算符的关联性和优先级。这里,输出结果为-2 3 0 1
,但我认为输出应为-2 3 1 1
,因为k
是也是预先递增的。为什么那不是答案?谢谢!
答案 0 :(得分:5)
||
具有短路评估,这意味着只有左侧是false
才会评估右侧。在您的情况下,这不会发生,因为i
和j
在递增后具有与0
不同的值,因此++k
不会被执行
当您有一个&&
,其中LHS表达式的计算结果为false
答案 1 :(得分:4)
<filter>
<filter-name>MyApplication</filter-name>
<filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class>
<init-param>
...
</init-param>
</filter>
...
<filter-mapping>
<filter-name>MyApplication</filter-name>
<url-pattern>/myApp/*</url-pattern>
</filter-mapping>
之前的表达式为真,因此{K}之后的||
部分不会被执行,因此||
不会递增。因此,K的值保持为0,m的值为1,因为k
的左边为真且||
始终为true || <anything>
。
答案 2 :(得分:2)
boost
和1 || 0 = 1
因此,在使用1 || 1 = 0
运算符求值语句时,如果第一个条件为TRUE,则无需计算此处发生的第二个表达式。
答案 3 :(得分:1)
不要与Precedence and Order of evaluation混淆。
逻辑 OR ||
的评估顺序是从左到右。
因此,如果left = true
,则left || right
永远不会执行right
。在您的代码中完全相同。
如您所知,在C中被视为true
的任何非零值,因此++i
或-2
都是true
。所以,
m = ++i && ++j || ++k;
m = (true && true) || bla bla bla; //right not even checked!
m = true
m = 1
您可以按预期获得输出。
对于实验,而不是i = -3
尝试i = -1
,那么方案将是
m = ++i && ++j || ++k;
m = false && (not going to evaluate) || ++k;
m = false || true;
m = true
m = 1
输出将是:0 2 1 1