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

时间:2016-08-04 18:36:25

标签: c++ c expression logical-operators

第一部分:

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 opreation所以不需要增加{{}的值1}})。这里的下一步执行AND操作应该是j的增量值(但仍然是k print 1的值)。

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

2 个答案:

答案 0 :(得分:20)

在C / C ++中,

&&的优先级高于||,将代码渲染为:

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

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

请参阅http://de.cppreference.com/w/cpp/language/operator_precedence了解运算符优先级。

答案 1 :(得分:-3)

我认为您使用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 可能会让您更难以了解正在发生的事情。

{{1}}

如果您想了解有关运营商优先级的更多信息,请查看https://en.wikipedia.org/wiki/Short-circuit_evaluation以了解有关您所看到的概念的更多信息以及http://en.cppreference.com/w/c/language/operator_precedence