Ben*_*min 11 c++ for-loop unsigned-integer
我在Stackoverflow上对C++中的反向循环进行了一些研究,它使用无符号整数而不是有符号整数.但我仍然不明白为什么会出现问题(请参阅带有for循环的Unsigned int反向迭代).为什么以下代码会产生分段错误?
#include <vector>
#include <iostream>
using namespace std;
int main(void)
{
vector<double> x(10);
for (unsigned int i = 9; i >= 0; i--)
{
cout << "i= " << i << endl;
x[i] = 1.0;
}
cout << "x0= " << x[0] << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我明白问题是当索引i等于零时,因为有类似溢出的东西.但我认为无符号整数可以取零值,不是吗?现在,如果我用有符号整数替换它,那绝对没有问题.
有人能用无符号整数向我解释反向循环背后的机制吗?
非常感谢你!
Mys*_*ial 26
这里的问题是无符号整数永远不会是负数.
因此,循环测试:
i >= 0
Run Code Online (Sandbox Code Playgroud)
永远都是真的.因此,你得到一个无限循环.
当它低于零时,它会回绕到unsigned最大值.
因此,您也将访问x[i]越界.
这对于有符号整数来说不是问题,因为它只会变为负数而因此失败i >= 0.
因此,如果要使用无符号整数,可以尝试以下方法之一:
for (unsigned int i = 9; i-- != 0; )
Run Code Online (Sandbox Code Playgroud)
和
for (unsigned int i = 9; i != -1; i--)
Run Code Online (Sandbox Code Playgroud)
这两个是由GManNickG和AndreyT在评论中提出的.
这是我最初的3个版本:
for (unsigned int i = 9; i != (unsigned)0 - 1; i--)
Run Code Online (Sandbox Code Playgroud)
要么
for (unsigned int i = 9; i != ~(unsigned)0; i--)
Run Code Online (Sandbox Code Playgroud)
要么
for (unsigned int i = 9; i != UINT_MAX; i--)
Run Code Online (Sandbox Code Playgroud)