为什么 while (str[i] == str[++i]);做一个无限循环?[复制]

Why does while (str[i] == str[++i]); make an infinite loop? [duplicate]

提问人:Seoyeon Oh 提问时间:1/4/2023 最后编辑:Seoyeon Oh 更新时间:1/4/2023 访问量:80

问:

我想让第一个字符的索引不同于(其中是 的数组)。istr[i]strchar

(让我忽略此处的越界条件。

我尝试的是:

char str[6] = {'h', 'h', 'h', 'a', 'a', '\0'};
int i = 0;
while (str[i] == str[++i]) ;

但这陷入了无限循环。(加起来就是一些大数字。i

同样的情况也发生在 .while (str[i++] == str[i]) ;

我知道我可以通过以下方式成功做到这一点:

while (str[i] == str[i+1]) i++;
i++;

但我不明白为什么我尝试的前两个代码不起作用。

为什么会导致无限循环?while (str[i] == str[++i]);

c 循环一 元算子

评论

10赞 Barmar 1/4/2023
这会导致未定义的行为,因为 的两侧之间没有序列点。==
0赞 Barmar 1/4/2023
如果它被编译为while (++i, str[i] == str[i])
3赞 Barmar 1/4/2023
您基本上假设表达式是从左到右计算的。在一些采用 C 语法的语言(例如 JavaScript 和 PHP)中是正确的,但 C 本身却不是。

答:

-3赞 Carlotta Fabian 1/4/2023 #1

我很确定 (str[i++] == str[i]) 执行以下操作:

  1. 计算 str[i] == str[i]
  2. 我++的 为确保如此,请考虑使用调试器单步执行代码

而另一个只是以相反的顺序进行

评论

0赞 Barmar 1/4/2023
OP 的代码使用预增量,而不是后增量。
1赞 Konrad Rudolph 1/4/2023
@Barmar OP 都尝试了。
1赞 Andrew Henle 1/4/2023
另一个只是以相反的顺序进行操作没有“顺序”,因为代码中没有序列点。在没有干预序列点的情况下读取和修改同一变量会调用未定义的行为。
1赞 BoP 1/4/2023
该语言没有确切地说明何时存储更新的值,只是说它有时会在 .在更新之前再次读取它是一个错误。i;
1赞 BoP 1/4/2023
@Eric - 是的,但我说的是这个例子while (str[i++] == str[i]) ;