Python 为什么这个所谓的无限循环程序会终止?

Python 为什么这个所谓的无限循环程序会终止?,python,c++,vector,infinite-loop,applicationwillterminate,Python,C++,Vector,Infinite Loop,Applicationwillterminate,我正在和我的朋友谈论这两段代码。他说Python一个终止,C++一个没有。 Python: arr = [1, 2, 3] for i in range(len(arr)): arr.append(i) print("done") C++: #包括 #包括 使用名称空间std; int main(){ 向量arr{1,2,3}; 对于(int i=0;i这里C++的编译器本身没有bug。 int溢出(由于i++),其行为未定义。(在发生溢出之前,您可能会在某些平台上耗尽内存。)请注意,没有

我正在和我的朋友谈论这两段代码。他说Python一个终止,C++一个没有。 Python:

arr = [1, 2, 3]
for i in range(len(arr)):
  arr.append(i)
print("done")
C++:

#包括
#包括
使用名称空间std;
int main(){
向量arr{1,2,3};
对于(int i=0;iCUT< P>这里C++的编译器本身没有bug。

int
溢出(由于
i++
),其行为未定义。(在发生溢出之前,您可能会在某些平台上耗尽内存。)请注意,没有定义会使
i
为负的行为,尽管这在具有2的补码有符号整数类型的机器上很常见,只要达到
std::numeric_limits::max()
,并且如果
i
为-1,则表示
ii
隐式转换为
unsigned
类型,因此
将为
false


Python版本预先计算 Lead(LeN(ARR))< /C> >,即后续的追加并不会改变初始值。

< P>这里C++编译器没有出现错误。

int
溢出(由于
i++
),其行为未定义。(在发生溢出之前,您可能会在某些平台上耗尽内存。)请注意,没有定义会使
i
为负的行为,尽管这在具有2的补码有符号整数类型的机器上很常见,只要达到
std::numeric_limits::max()
,并且如果
i
为-1,则表示
ii
隐式转换为
unsigned
类型,因此
将为
false


Python版本预先计算
范围(len(arr))
;也就是说,后续的附录不会更改初始值。

@Scheff:
i
是继续循环的条件,而不是停止循环的条件。Python版本预先计算
范围(len(arr))设置迭代次数,所以是有限的。C++版本将元素追加到<代码> ARR < /C>中,因此<代码> AR.siz()/Cype >每次迭代都增加。<代码> i <代码>总是小于 > ARS.siz()/CODE >,所以循环将继续进行。(直到内存耗尽,或
i
溢出并导致未定义的行为,在此之后,所有赌注都将取消)。引入一个新变量,如
size=arr.size()
在循环之前,将终止条件更改为
i
,循环将是有限的。@user2357112supportsMonica因此,我假设环绕->负
int
隐式转换为
size\t
(可能是无符号的64位类型)Seff:似乎是一个可能的假设。这是C++编译器中的一些bug吗?如果C++编译器在这样的一个玩具程序中有这样的错误,它们可能会被编译器的操作搞笑。< /代码>是继续循环的条件,不是停止它的条件。Python版本预先计算<代码>范围(LeN(ARR))< /C> >设置迭代次数,所以是有限的。C++版本将元素追加到<代码> ARR
,所以<代码> ARR.siz()
随着每次迭代的增加而增加。
i
因此总是小于
arr.size()
,因此循环将继续进行(直到内存耗尽,或者
i
溢出并导致未定义的行为,之后所有赌注都将被取消)。引入一个新变量,如
size=arr.size()
在循环之前,将终止条件更改为
i
,循环将是有限的。@user2357112supportsMonica因此,我假设环绕->负
int
隐式转换为
size\t
(可能是无符号的64位类型)Seff:似乎是一个可能的假设。这是C++编译器中的一些bug吗?如果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;
}