【问题标题】:Why does "for (i = 100; i <= 0; --i)" loop forever?为什么“for (i = 100; i <= 0; --i)” 会永远循环?
【发布时间】:2011-06-14 20:52:08
【问题描述】:
unsigned int i;
for (i = 100; i <= 0; --i)
    printf("%d\n",i);

【问题讨论】:

  • 准备好被答案淹没
  • 取决于你想让代码做什么......
  • 欢迎来到 StackOverflow
  • @aaa:它们都不同。 :)

标签: c++ c loops comparison unsigned


【解决方案1】:

如果您希望它从 100 循环到 0,则在循环的第二个条件中应为 i &gt;= 0

正如其他人指出的那样,您需要将 i 的定义更改为有符号整数(只是 int),因为当计数器应该为 -1 时,它将是其他一些正数,因为您将其声明为 unsigned int

【讨论】:

  • "如果你想让它从 100 循环到 0,应该是 i >= 0。" -- 不,i >= 0 会产生无限循环。
  • 我不这么认为?当循环中的第二个语句为假时,您认为循环退出了吗?
  • "当循环中的第二个语句为假时,您认为循环被踢出吗?" - 是的。 “如果您希望它从 100 循环到 0,则在循环的第二个条件中应该是 i >= 0。” -- 还是不行,那会产生无限循环。
  • @John:它永远不会是假的。当它等于零时,它将递减并溢出回最大uint 大小。到无穷...
  • 我真的很担心这些年来我一直在做错误的 for 循环! ;)
【解决方案2】:

由于i 是无符号的,它永远不会小于零。删除unsigned。另外,将&lt;= 替换为&gt;=

【讨论】:

    【解决方案3】:

    由于i 是无符号的,表达式i &lt;= 0 是可疑的并且等价于i == 0

    并且代码不会打印任何内容,因为条件 i &lt;= 0 在第一次评估时为假。

    【讨论】:

      【解决方案4】:

      如果代码应该什么都不做,那么它就没有问题。

      假设您希望它打印循环索引 i 从 100 到 1,您需要将 i &lt;= 0 更改为 i &gt; 0

      因为它是一个无符号整数,所以不能使用i &gt;= 0,因为这会导致它无限循环。

      【讨论】:

      • 我不完全同意。如果代码应该什么都不做,那么那里的代码太多了。 :)
      【解决方案5】:

      循环检查i &lt;= 0;

      i 永远不会小于或等于零。它的初始值为100。

      【讨论】:

        【解决方案6】:

        从技术上讲,该代码没有任何问题。 i

        【讨论】:

          【解决方案7】:

          我怀疑你的意思是测试是i &gt; 0

          【讨论】:

          • 是的。不幸的是,看起来你为他做了功课。
          【解决方案8】:

          false

          for循环

          • 初始化:i = 100
          • test: i

          将测试改为i &gt; 0(100次)

          i &gt;= 0(101 次)连同声明signed int i;,这样它实际上会降低到-1。 unsigned int 将从 0 变为 max-int(溢出)。

          【讨论】:

            【解决方案9】:

            如果你想让它打印从 100 到 0 的所有数字,那么你需要

            unsigned int i;
            for (i = 100; i >= 0; --i)
                printf("%d\n",i);
            

            第一次在原始代码中运行循环时,i 为 100。测试 '100

            【讨论】:

            • 还有一个问题是循环不会退出,因为i 被声明为无符号。请参阅我的回答中的讨论。
            猜你喜欢
            • 2019-04-30
            • 1970-01-01
            • 2016-10-16
            • 1970-01-01
            • 2014-08-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多