Python 为什么这个所谓的无限循环程序会终止?
我正在和我的朋友谈论这两段代码。他说Python一个终止,C++一个没有。 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++),其行为未定义。(在发生溢出之前,您可能会在某些平台上耗尽内存。)请注意,没有
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 CUT< 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;
}