【问题标题】:Why is this for loop with an unsigned int endless?为什么这个带有无符号整数的 for 循环是无穷无尽的?
【发布时间】:2020-06-29 19:54:20
【问题描述】:
for (unsigned i = 0; i < 3; i++) {
    if (i == 2) i = -1;
}

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

【问题讨论】:

  • 是的 -1 是 UINT_MAX 然后 i++ 发生所以 i 再次变为 0。

标签: c for-loop infinite-loop unsigned unsigned-integer


【解决方案1】:

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

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

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

(i<3)

3>>执行代码

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

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

【讨论】:

  • "(i 总是为零) as (-1+1=0)" -- 然而-1 + 1 却无处可寻。 iunsigned int,所以i = -1i 设置为UINT_MAX(必须至少 65535)。后面的i++ 尝试将i 递增到UINT_MAX 之外,导致unsigned wrap-around 为0。效果是一样的,但是细节错误。
【解决方案2】:

如果你想在循环的条件下这样做

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;
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      如果我重写你的代码,那么可能会更清楚地了解原因

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

      i++ 发生在循环的末尾,因此 i 再次变为 0

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-21
        • 2013-09-23
        • 1970-01-01
        • 2021-09-20
        相关资源
        最近更新 更多