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