这是我编写的示例代码。 我现在退出如下,
size 0
Here
为什么即使myVec.size的值为零,此代码也会进入for循环
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> myVec;
cout <<" size " << myVec.size() << endl;
for (int i=0; i<myVec.size() -1; i++)
{
cout << " Here " << endl;
break;
}
return 0;
}
答案 0 :(得分:6)
size()
返回无符号类型。对于无符号类型,0 - 1
“下溢”到最大值。由于i
小于它转换为的类型的最大可能值,因此输入for循环。
答案 1 :(得分:3)
您的问题显示为什么通常最好避免使用unsigned
数字,而这些数字不能为负数&#34;为什么标准图书馆课程不遵守本指南是不幸的。请参阅Scott Meyers的Signed and Unsigned Types in Interfaces。
由于myVec
为空,其大小为0,而您的myVec.size() - 1
表达式变为0 - 1,如果类型已签名,则为-1。但是,它是未签名的,因此它变成了一个巨大的正数。
在C ++ 98/03中,迭代向量的更好方法是使用迭代器:
for (std::vector<int>::const_iterator iter = myVec.begin(); iter != myVec.end(); ++iter)
{
int i = *iter;
}
在C ++ 11中,可以更简洁地编写:
for (auto iter = myVec.begin(); iter != myVec.end(); ++iter)
{
int i = *iter;
}
甚至更好,使用基于范围的for
循环:
for (auto i : myVec)
{
}