为什么这个带有 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_MAX
和 3
你应该写
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)
所以这个循环是无限循环
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_MAX
和 3
你应该写
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) 所以这个循环是无限循环