vector.size() - 2 导致无限循环 - C++
vector.size() - 2 leads to infinite loop - C++
我正在尝试 运行 向量上的循环,而不是最后两个元素上的循环。因此,为此我使用了以下实现:
vector<int> x;
for(int i=0;i<x.size()-2;i++){
cout<<"looping over element"<<endl;
}
但是,运行在没有向 x 中插入任何元素的情况下执行上述代码会导致无限循环。
爱德华 link:
为什么我会出现这种行为?如果 x.size()==0
那么 i<-2
条件不应该成立,代码永远不会进入 for 循环
当x.size()小于2,你减去2,你会得到一个很大的值,因为结果是无符号的,而且((someunsigned)-1)是一个巨大的数字
所以循环运行:
i=0
i=50000
i=1000000
i=4,294,967,295 //Stop
所以,你没有无限循环,只有很长的运行循环
x.size()
returns 一个无符号值。如果小于 2
则该值将下溢,结果将变得非常大。
另一方面,由于 i
是 signed 类型母鸡,它迟早会达到 int
的最大值(这将仍然小于 x.size() - 2
) 的结果,然后 i++
将导致算术溢出,即 未定义行为.
在尝试此循环之前,您必须确保 x.size() >= 2
、 和 您需要确保计数器变量是无符号类型(如 size_t
):
if (x.size() >= 2)
{
for (size_t i = 0; i < x.size() - 2; ++i)
{
// ...
}
}
我正在尝试 运行 向量上的循环,而不是最后两个元素上的循环。因此,为此我使用了以下实现:
vector<int> x;
for(int i=0;i<x.size()-2;i++){
cout<<"looping over element"<<endl;
}
但是,运行在没有向 x 中插入任何元素的情况下执行上述代码会导致无限循环。 爱德华 link:
为什么我会出现这种行为?如果 x.size()==0
那么 i<-2
条件不应该成立,代码永远不会进入 for 循环
当x.size()小于2,你减去2,你会得到一个很大的值,因为结果是无符号的,而且((someunsigned)-1)是一个巨大的数字 所以循环运行:
i=0
i=50000
i=1000000
i=4,294,967,295 //Stop
所以,你没有无限循环,只有很长的运行循环
x.size()
returns 一个无符号值。如果小于 2
则该值将下溢,结果将变得非常大。
另一方面,由于 i
是 signed 类型母鸡,它迟早会达到 int
的最大值(这将仍然小于 x.size() - 2
) 的结果,然后 i++
将导致算术溢出,即 未定义行为.
在尝试此循环之前,您必须确保 x.size() >= 2
、 和 您需要确保计数器变量是无符号类型(如 size_t
):
if (x.size() >= 2)
{
for (size_t i = 0; i < x.size() - 2; ++i)
{
// ...
}
}