为什么 j 在 (++i || ++j) 中不递增
Why isn't j incremented in (++i || ++j)
我不明白这段代码的输出:
long i=5, j=10;
if (++i || ++j) printf("%ld %ld\n", i, j);
else printf("Prog1\n");
输出是 6 和 10。我期望是 6 和 11。为什么 j
没有递增?
您的 if 条件使用 short-circuited 逻辑或运算符 ||
。由于运算符左侧 (++i
) 的计算结果为 true
,右侧 (++j
) 不会执行。
逻辑或运算符 ||
是 short circut operator。这意味着如果仅通过查看左操作数即可确定结果,则不会评估右操作数。
C standard 第 6.5.14 节关于逻辑或运算符的说明如下:
4 Unlike the bitwise |
operator, the ||
operator guarantees
left-to-right evaluation; if the second operand is evaluated, there is
a sequence point between the evaluations of the first and second
operands. If the first operand compares unequal to 0, the second
operand is not evaluated.
在这种情况下,计算 ++i
,结果为 6(具有递增 i
的副作用)。如果任一操作数不是零。由于左侧为 non-zero,因此不计算右侧,随后 j
不递增。
在if
语句中只执行了++i
,因为++i
不为零,已经被视为true
。因为||
OR 操作,所以不需要执行++j
.
我不明白这段代码的输出:
long i=5, j=10;
if (++i || ++j) printf("%ld %ld\n", i, j);
else printf("Prog1\n");
输出是 6 和 10。我期望是 6 和 11。为什么 j
没有递增?
您的 if 条件使用 short-circuited 逻辑或运算符 ||
。由于运算符左侧 (++i
) 的计算结果为 true
,右侧 (++j
) 不会执行。
逻辑或运算符 ||
是 short circut operator。这意味着如果仅通过查看左操作数即可确定结果,则不会评估右操作数。
C standard 第 6.5.14 节关于逻辑或运算符的说明如下:
4 Unlike the bitwise
|
operator, the||
operator guarantees left-to-right evaluation; if the second operand is evaluated, there is a sequence point between the evaluations of the first and second operands. If the first operand compares unequal to 0, the second operand is not evaluated.
在这种情况下,计算 ++i
,结果为 6(具有递增 i
的副作用)。如果任一操作数不是零。由于左侧为 non-zero,因此不计算右侧,随后 j
不递增。
在if
语句中只执行了++i
,因为++i
不为零,已经被视为true
。因为||
OR 操作,所以不需要执行++j
.