这里的逻辑运算符是如何短路的?

3
#include <stdio.h>

int main()
{
   int x = -2;
   while (x++ || x==0)
   {
      printf("X");
   }
}

输出结果为

XX

为什么?
我期望这段代码会进入无限循环,因为递增将使逻辑 OR 的两侧都变为 true。

2
将输出更改为更有用的形式:printf("X = %d\n", x);,然后看看会发生什么。当 x 为零时,x++ 将被执行,但是条件的第二个部分也将计算为假(因为在这发生时 x1)。在评估条件的左侧和右侧之间存在一个序列点。 - Jonathan Leffler
2
当 x 为 0 时,“x++”为假,然后 x 变成 1 并比较“x == 0”,这也是假的(在 x 上进行后增量)。 - Garr Godfrey
1
如果你这样写 while (++x || x == 0) 会导致一个无限循环。 - Garr Godfrey
2
对于第一个while测试,x起始值为-2,然后变为-1。对于第二个while测试,x起始值为-1,然后变为0。对于第三个while测试,x起始值为0,然后变为1。这种变化在评估 x == 0 条件之前发生,因此实际上测试的是 0 || 1 == 0,这是错误的。 - Tom Karzes
1个回答

5
逻辑 OR 运算符保证左侧将被完全评估,包括任何副作用,在右侧被评估之前(如果有的话)。更正式地说,在评估左侧和评估右侧之间存在一个序列点。
如果在评估此条件时 x 为0:
(x++ ||x==0)

左侧将计算为0,即false,并且x增加到1。然后因为左侧是0,右侧被计算。由于x现在是1,右侧也计算为0,使条件为false并导致循环终止。


@Garr Godfrey 我是一个编程初学者,对于逻辑运算符的短路、自增和序列点,你能给我推荐一些书籍和互联网资源来学习吗? - FreeDragon
@FreeDragon -- C标签信息页面权威C书籍指南列表 - ad absurdum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接