为啥 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) 中不递增的主要内容,如果未能解决你的问题,请参考以下文章