[英]Why does this supposedly infinite loop program terminate?
我正在和我的朋友谈论这两段代码。 他说 python 一个终止,C++ 一个没有。
Python:
arr = [1, 2, 3]
for i in range(len(arr)):
arr.append(i)
print("done")
C++:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> arr{1,2,3};
for(int i = 0; i < arr.size(); i++){
arr.push_back(i);
}
cout << "done" << endl;
return 0;
}
我对此提出了挑战,并在 2 台计算机上运行了它。 第一个用完了 memory (bad alloc) 因为它有 4gb 的内存。 我的 mac 是 12gb 的 ram,它能够正常运行和终止。 我认为它不会永远运行,因为向量中的 size() 类型是无符号整数。 由于我的 Mac 是 64 位的,我认为它可以存储 2^(64-2)=2^62 个整数(这是真的),但由于某种原因,大小的无符号整数是 32。
这是 C++ 编译器中的一些错误,它不会将 max_size() 更改为与系统硬件相关吗? 溢出导致程序终止。 还是出于其他原因?
您的 C++ 编译器中没有出现错误。
int
溢出(由于i++
),其行为未定义。 (在此溢出发生之前,您可能会在某些平台上用完 memory。)请注意,没有定义的行为会使i
为负数,尽管这在具有 2 的补码有符号整数类型的机器上很常见std::numeric_limits<int>::max()
达到,如果i
是 -1 ,那么i < arr.size()
将是false
的,因为i
隐式转换为unsigned
类型。
Python 版本预先计算range(len(arr))
; 即后续追加不会更改该初始值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.