0

我正在和我的朋友谈论这两段代码。他说 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 台计算机上运行了它。第一个内存不足(错误分配),因为它有 4gb 的内存。我的 mac 是 12gb 的 ram,它能够正常运行和终止。我认为它不会永远运行,因为向量中的 size() 类型是无符号整数。由于我的 Mac 是 64 位的,我认为它可以存储 2^(64-2)=2^62 个整数(这是真的),但由于某种原因,大小的无符号整数是 32。

这是 C++ 编译器中的一些错误,它不会将 max_size() 更改为相对于系统的硬件?溢出导致程序终止。还是出于其他原因?

4

1 回答 1

2

您的 C++ 编译器中没有错误在这里体现出来。

int正在溢出(由于i++),其行为未定义。(在发生此溢出之前,您可能会在某些平台上耗尽内存。)请注意,没有定义的行为会导致i负数,尽管这在具有 2 的补码有符号整数类型的机器上很常见,一旦std::numeric_limits<int>::max()获得,如果i是-1,那么i < arr.size()将是false由于隐式转换为i类型unsigned

Python 版本预先计算range(len(arr));即后续追加不会更改该初始值。

于 2020-04-15T05:30:10.767 回答