为什么语句"m = ++i ||++j && ++k"?

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

本文关键字:++j ++k ++i 语句 为什么      更新时间:2023-10-16

第一部分:

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如果您想了解有关运算符优先级的更多信息。

相关文章:
  • 没有找到相关文章