簡體   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