Почему эта предположительно программа с бесконечным циклом завершается?

Я разговаривал со своим другом об этих двух частях кода. Он сказал, что питон завершается, а С ++ - нет.

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)); то есть последующие добавления не изменяют это начальное значение.

Другие вопросы по тегам