我是c++的初学者。
当我做运动时,我遇到了这个问题。
按密码!!
我期望从factors.size()到0。但是,这不像。它返回我,从factors.size()到0,-1(4294967295),-2(4294967294),.
为什么这段代码不返回0而不停止?
如果你知道,请让我解释。
vector<int>::size_type iter;
for (iter=factors.size()-1 ; iter >= 0 ; --iter)
{
//cout << factors[iter];
cout << iter;
cout << " : " << factors[iter] << endl;
}//----------- Full Code --------------//
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int find_max_bit(int n)
{
int i = 0;
int nTmpNum = 0;
int nMaxJisu = 0;
int ret = 0;
nTmpNum = n;
while (nTmpNum >= 1)
{
nMaxJisu++;
nTmpNum = (int) (nTmpNum / 2);
}
ret = (int) nMaxJisu;
return ret;
}
std::vector<int> binary_factors(int n)
{
std::vector<int> factors;
cout << "find_max_bit : " << find_max_bit(n) << endl;
factors.reserve(find_max_bit(n));
int bi_Num;
for (int i = 0; i < find_max_bit(n) ; i++)
{
bi_Num = n >> i & 0x1;
cout << bi_Num;
factors.push_back(bi_Num);
cout << " : size : " << factors.size() << endl;
}
return factors;
}
int main()
{
int nNum;
cin >> nNum;
while (nNum < 0 || nNum > 31)
{
cin >> nNum;
}
auto factors = binary_factors(nNum);
cout << "factors.size() = " << factors.size() << endl;
cout << nNum;
for (auto it = factors.begin(); it != factors.end(); ++it)
cout << ' ' << *it;
cout << endl;
vector<int>::size_type iter;
for (iter=factors.size()-1 ; iter >= 0 ; --iter)
{
//cout << factors[iter];
cout << iter;
cout << " : " << factors[iter] << endl;
}
}发布于 2020-06-26 22:59:46
这个循环:
for (iter=factors.size()-1 ; iter >= 0 ; --iter)保证永远不会终止,因为iter (即vector<int>::size_type )是一个无符号类型。当你从一个没有符号的0中减去1时,你会得到一个大的正数,而不是一个负数。因为iter永远不会变成负值,所以循环条件永远不会满足。
您可以通过使iter成为一个有符号整数来解决这个问题:
for (auto iter = static_cast<int>(factors.size()) - 1 ; iter >= 0 ; --iter)发布于 2020-06-26 23:23:44
问题是,vector<int>::size_type是一个无符号整数,而且您正在向后迭代,就好像它是有符号整数一样。您的第一个期望是正确的,即它将从
假定
factors.size()-1到0假设factors.size()>0
但是,当iter在语句for (iter=factors.size()-1 ; iter >= 0 ; --iter)中达到0时,条件iter >= 0将为真,从而导致语句--iter发生。这将导致iter下垂,并等于该无符号类型的最大可表示值(在您的示例中为4294967295 )。重要的是,iter不会变成负值,循环继续并调用未定义的行为,因为它通过语句factors[iter]访问超出边界的内存。
以下是解决这个问题的两种方法。
如果需要索引,则
for (auto iter=factors.size(); iter--;)
如果您只需要该值,则可以使用反向迭代器。
for (auto iter=factors.rbegin(); iter != factors.rend(); ++iter)
https://stackoverflow.com/questions/62603926
复制相似问题