为啥 j 在 (++i || ++j) 中不递增

Posted

技术标签:

【中文标题】为啥 j 在 (++i || ++j) 中不递增【英文标题】:Why isn't j incremented in (++i || ++j)为什么 j 在 (++i || ++j) 中不递增 【发布时间】:2018-09-06 09:12:14 【问题描述】:

我不明白这段代码的输出:

 long i=5, j=10;
 if (++i || ++j)  printf("%ld  %ld\n", i, j);
 else  printf("Prog1\n");

输出是 6 和 10。我希望是 6 和 11。为什么 j 没有增加?

【问题讨论】:

您的 if 语句正在评估 OR 语句,因此首先在管道左侧读取 ++i ||和增量。它忽略了 ++j,因此它最终是 6 和 10... 我不知道你为什么要这样做,但你可能不应该......你想在这里达到什么效果? 【参考方案1】:

逻辑或运算符||short circut operator。这意味着如果仅通过查看左侧操作数即可确定结果,则不会计算右侧操作数。

C standard 的第 6.5.14 节有关逻辑 OR 运算符的声明如下:

4 与按位 | 运算符不同,|| 运算符保证 从左到右的评估;如果计算第二个操作数,则有 第一个和第二个评估之间的序列点 操作数。 如果第一个操作数比较不等于 0,则第二个 不计算操作数。

在这种情况下,++i 被求值,结果为 6(具​​有递增i 的副作用。如果任一操作数非零,则逻辑 OR 运算符求值为 1(即真)。由于左侧非零,不计算右侧,随后j 不递增。

【讨论】:

【参考方案2】:

您的 if 条件使用短路逻辑 OR 运算符 ||。由于运算符左侧 (++i) 的计算结果为 true,因此右侧 (++j) 不会被执行。

【讨论】:

【参考方案3】:

if 语句中只执行了++i,因为++i 不为零并且已经被视为true。因为|| OR 操作,所以不需要执行++j

【讨论】:

以上是关于为啥 j 在 (++i || ++j) 中不递增的主要内容,如果未能解决你的问题,请参考以下文章

序列递推——cf1204E

递推求欧拉函数的最简单的详解

转动态规划:最长递增子序列Longest Increasing Subsequence

为啥递增和递减是一元运算

为啥一个接一个声明的两个变量在内存中不相邻?

最长递增子序列