为什么在语句“m = ++i ||”中“k”不递增++j && ++k”?

Why isn't “k” incremented in the statement “m = ++i || ++j && ++k”?

第一部分:

i=j=k=1;
m = ++i && ++j || ++k;
printf("%d, %d, %d, %d\n", i, j, k, m);

输出:2, 2, 1, 1

第一部分很容易理解,这里++i && ++j先执行,这是真的(并且增加i和j的值)所以不需要检查下一部分的OR操作(不需要增加k的值) 。

第二部分:

i=j=k=1;
m = ++i || ++j && ++k;
printf("%d, %d, %d, %d\n", i, j, k, m);

输出:2、1、1、1

第二部分容易理解,这里++i || ++j先执行,其中++i为真(并且增加i的值,因为OR运算所以不需要增加值j)。接下来在这里执行AND操作应该是k=2的增量值(但仍然是k print 1的值)。

亲爱的利他主义者,请解释一下第二部分发生了什么。

&& 在 C/C++ 中的优先级高于 ||,将您的代码呈现为:

m = ++i || (++j && ++k);

由于++i已经为真,所以不执行第二部分(short-circuit evaluation)。

运算符优先级参见 http://de.cppreference.com/w/cpp/language/operator_precedence

我认为您对 i, j, k, and m 的使用可能会使您更难看到正在发生的事情。

int i, j, k;

i=j=1;
k = ++i && ++j;
printf("%d, %d, %d\n", i, j, k); // 2, 2, 1

i=j=1;
k = ++i || ++j;
printf("%d, %d, %d\n", i, j, k); // 2, 1, 1

如果您想了解有关运算符优先级的更多信息,请查看 https://en.wikipedia.org/wiki/Short-circuit_evaluation to learn more about the concept behind what you are seeing and http://en.cppreference.com/w/c/language/operator_precedence