Почему эта предположительно программа с бесконечным циклом завершается?
Я разговаривал со своим другом об этих двух частях кода. Он сказал, что питон завершается, а С ++ - нет.
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;
}
Я оспорил это и запустил его на двух компьютерах. Первому не хватило памяти (плохое распределение), потому что у него было 4 ГБ оперативной памяти. У моего Mac было 12 ГБ оперативной памяти, и он мог нормально работать и завершать работу. Я думал, что это не будет работать вечно, потому что тип size() в векторе - это целое число без знака. Поскольку мой Mac был 64-битным, я думал, что он может хранить 2^(64-2)=2^62 int (что верно), но по какой-то причине unsigned int для размера 32.
Это какая-то ошибка в компиляторе C++, которая не изменяет max_size() относительно аппаратного обеспечения системы? Переполнение вызывает завершение программы. Или по какой-то другой причине?
1 ответ
В вашем компиляторе C++ нет ошибки, которая проявляется здесь.
int
переполнен (из-за i++
), поведение которого не определено. (Вполне возможно, что у вас закончится память на некоторых платформах до того, как произойдет это переполнение.) Обратите внимание, что нет определенного поведения, которое заставитi
отрицательный, хотя это обычное явление на машинах с двумя дополнительными знаковыми целочисленными типами один раз std::numeric_limits<int>::max()
достигается, а если i
я сказал тогда i < arr.size()
было бы false
из-за неявного преобразования i
для unsigned
тип.
Версия Python предварительно вычисляет range(len(arr))
; то есть последующие добавления не изменяют это начальное значение.