为什么代码中的输出不是这个?

时间:2015-07-07 10:07:29

标签: c operator-precedence

#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是也是预先递增的。为什么那不是答案?谢谢!

4 个答案:

答案 0 :(得分:5)

||具有短路评估,这意味着只有左侧是false才会评估右侧。在您的情况下,这不会发生,因为ij在递增后具有与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)

boost1 || 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