为什么语句"m = ++i ||++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, %dn", 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, %dn", 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
已经为真,因此不执行第二部分(短路评估)。
请参阅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, %dn", i, j, k); // 2, 2, 1
i=j=1;
k = ++i || ++j;
printf("%d, %d, %dn", i, j, k); // 2, 1, 1
看看https://en.wikipedia.org/wiki/Short-circuit_evaluation了解更多关于你所看到的背后的概念http://en.cppreference.com/w/c/language/operator_precedence如果您想了解有关运算符优先级的更多信息。
相关文章:
- 没有找到相关文章