无限循环会不会自行结束
Will an Infinite Loop ever end by Itself
假设我们有以下循环:
for (int i = 1; i < 2; i--)
{
cout << i << endl;
}
毫无疑问,这是一个无限的for循环。但是,我的问题是它会运行多久?因为我的教授说,给定一个int是4 bytes = 32 bits
的,它可以存储来自-2147483648 to 2147483647
的数字。鉴于此,他接着说,在for循环中,如果它达到这些数字之一,并且循环仍然被编程为继续(就像这个一样),那么这个数字将变为正数,并且条件将被满足,终止循环。
我的问题是:这是怎么发生的?为什么数字 -2147483648 在 for 循环中变成 +2147483648,为什么 +2147483648 在 for 循环中变成 -2147483648?因为我曾经认为,一旦计数器击中2147483649,就会发生分段错误。感谢您的回复!
回答你的标题问题; Will an Infinite Loop ever end by Itself
:
不。
但是你的循环不仅不是无限的,而且由于 for 循环条件,它甚至不会运行一次。
for (int i = 1; i > 2; i--)
i
,在 1 处永远不会满足循环条件 i>2。
假设你的意思是i < 2
,那么答案是,我不知道。整数溢出是C++
中未定义的行为(请参阅此处)。
在大多数情况下,它会环绕,但由于行为是不确定的,因此讨论真正会发生什么没有真正的意义。
为什么 +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 需要为 1111 1111,例如,如果您计算 -1 + 2 = 1
1111 1111
+ 0000 0010
1111 11 (carry)
---------
0000 0001
如果递增值 0111 1111 = 127,则得到 1000 0000 = -128。这正是你的情况,只是多了几点。
然而,正如Fantastic Mr. Fox已经提到的,它是否真的环绕取决于编译器实现,而不是由标准定义。
- 为什么我的 while 循环永远不会在 C++ 中的数字猜测游戏中结束?
- 具有管理员权限的外壳执行不会结束
- WaitForSingleObject 不会等待进程结束
- 返回状态后,功能不会结束
- 虽然带有 getline 的循环不会因用户输入而结束
- 程序不会在必须时结束并显示输出
- 为什么我的线程永远不会结束
- 如何将项目属性设置为删除警告MSB8004:中间目录不会以落后的斜线结束
- 输入文件读取错误的值,eof 控制循环不会结束
- 函数永远不会在 switch 语句中结束
- 删除不会在函数结束时释放内存
- 使用 VCL 的 C++:关闭辅助表单不会结束进程
- 无限循环会不会自行结束
- 程序在输出后不会结束
- C++ if 语句不会结束
- C++使用cin.get来获取一个字符,但在遇到EOF时不会结束while循环
- 这种错误检查方法的性能会不会太高
- 如果使用GPU,PhysX-simulate()永远不会结束
- 在C++函数中 #define 会不会很奇怪
- 临时的,在语句结束时不会被销毁