为什么这个带有 unsigned int 的 for 循环是无穷无尽的?

Why is this for loop with an unsigned int endless?

for (unsigned i = 0; i < 3; i++) {
    if (i == 2) i = -1;
}

我不明白为什么这个循环是无限的。我知道它在 i = -1 但 UINT_MAX 大于 3 时回绕。

如果我重写你的代码,那么可能会更清楚明白为什么

unsigned i = 0;
while (i < 3) {
    if (i == 2) i = -1;
    i++;
}

i++ 发生在循环的末尾,所以 i 又变成了 0

因为一旦 i 变为 2 它将变为 0 然后 i++, 循环继续,直到 i=2 再次变为 0,同样的过程将继续。

如果你想在循环的条件下

for (unsigned i = 0; i < 3; i++) {
    if (i == 2) i = -1;
}

比较了 UINT_MAX3 你应该写

for (unsigned i = 0; i < 3; i++) {
    if (i == 2) i = -2;
}

在这种情况下递增 i 你会得到 UINT_MAX。否则,如果 i 已经包含 UINT_MAX,那么在循环表达式 i++ 中递增它,您将得到 0,结果是一个无限循环。

或者你可以这样写,例如

for (unsigned i = 0; i < 3; i++) {
    if (i == 2) i = ~i;
}

因为for循环会按照这样的安排执行

for (unsigned i = 0; i < 3; i++)

1>>仅在第一次迭代时的初始值 (i=0) 2>>检查终端条件

(i<3)

3>>执行代码

(if(i==2) i=-1) 

4>>增量步 i++ 所以(i 总是变为零)as (-1+1=0) 所以这个循环是无限循环