繁体   English   中英

为什么这个所谓的无限循环程序会终止?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM