当前位置: 首页 > 知识库问答 >
问题:

无限循环会自行结束吗?

谭向晨
2023-03-14

假设我们有以下循环:

    for (int i = 1; i < 2; i--)
    {
        cout << i << endl;
    }

毫无疑问,这是一个无限的for循环。然而,我的问题是,它将运行多长时间?因为我的教授说,给定一个int是< code>4 bytes = 32 bits,它可以存储一个从< code>-2147483648到2147483647的数。考虑到这一点,他接着说,在for循环中,如果它到达这些数字中的一个,并且循环仍然被编程为继续(就像这个一样),那么该数字将变为正数,并且条件将被满足,从而终止循环。

我的问题是:这是怎么发生的?为什么数字-2147483648在for循环中变成2147483648,为什么2147483648在for循环中变成-2147483648?因为我以前认为计数器一碰到2147483649就会出现分段错误。谢谢你的回复!

共有2个答案

封景曜
2023-03-14

为什么2147483647转向 -2147483648

如果用位表示来写整数,这一点就变得很明显了。为简单起见,我们取一个8位变量,如char或std::int8_t。一个8位类型可以保存2^8 = 256个不同的值。对于有符号变量,这些是从-128到127的值(0也是一个值,因此最多为127)。几个例子:

0000 0000 = 0
0000 0001 = 1
0111 1111 = 127

1111 1111 = -1
1111 1110 = -2
1000 0000 = -128

您可以很容易地看到,如果您例如计算-1 2=1,则值-1需要为1111 1111

  1111 1111
+ 0000 0010
  1111 11     (carry)    
  ---------
  0000 0001

如果增加值0111 1111 = 127,则得到1000 0000 = -128。这正是发生在你身上的事情,只不过多了一些。

然而,正如Fantastic Fox先生已经提到的那样,它是否真的被包装起来取决于编译器的实现,而不是由标准定义的。

章宏峻
2023-03-14

回答你的标题问题;无限循环会自己结束吗

不。

但是你的循环不仅不是无限的,因为for循环条件,它甚至不会运行一次。

for (int i = 1; i > 2; i--)

i,在1永远不会满足循环条件i

让我们说,虽然你的意思是

在大多数情况下,它都会出现,但由于行为尚未定义,因此讨论真正会发生什么没有实际意义。

 类似资料:
  • hasNext()的定义是“如果此扫描仪的输入中有另一个标记,则返回true。此方法可能会在等待输入扫描时阻塞。扫描仪不会前进超过任何输入。” 当我把 standardInput.hasNext() 放在 for 循环中时,程序会向无穷大运行。但是如果我把它放在 while-loop 中,它不会运行到无穷大。这两个程序之间的区别在哪里,为什么其中一个有效而另一个无效? for循环: while-l

  • 我对react钩子和效果有点陌生,在使用useEffect时遇到了问题 上面的代码是我构建的useEffect,用于使用axios获取数据库中的所有数据,并且我将所有数据放在一个称为reports的状态中。 但是当我console.log报告时,它会导致无限循环。我不知道为什么? 让我给你看一个我做的简单动作。 我正在做一个按钮,当它被点击时,报告的状态(按id)将被更新。 这是该州报告结构的样本

  • 我正在用我的java书复习数据结构,我需要重新创建一个循环链表。我对这个无限循环的链表有问题,弄不清楚为什么。我可以将值插入到列表中,但是打印和删除这些值似乎会无限循环最初插入的值。我如何更改我的List类以避免无限循环? CircularList.Class 链接类

  • 我正在尝试制作一个简单的程序,它使用扫描器进行输入,并有一个while循环,该循环继续输入,直到输入结束字符为止。我想让扫描器接受输入并将一个字符串添加到堆栈列表中。我试图弄清楚为什么这段代码在键入空格时不终止while循环。

  • 基本上,findNode()搜索其数据等于作为参数插入的字符串的节点,但当我调用outputList()方法(该方法返回屏幕上当前节点的字符串表示)时,它将继续无限循环。 outputList方法是: 如有任何帮助,我们将不胜感激。提前道谢。

  • 我有一个带感应帽的覆盆子皮。我制作了一个二进制时钟,我想在Sense hat的显示器上显示并保持更新。然而,我想要的能力,开关时钟与操纵杆中间。一切都很好,除了我的时钟的更新循环阻止任何新的输入一旦启动。 我一直在考虑如何解决这个问题。如何允许脚本/时钟保持运行,并且仍然接受来自操纵杆的新操作。但是一旦while循环开始,我就卡住了。我不知道该用谷歌搜索什么。我已经开始研究async/await,