第一部分:
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的值)。
亲爱的利他主义者,请解释第二部分会发生什么。
答案 0 :(得分:20)
&&
的优先级高于||
,将代码渲染为:
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。