C ++无符号无限循环比较错误

c++ unsigned infinite loop comparison bug

注意到我正在处理的一个程序中存在错误,提取了代码,基本上就是这样。
它与有符号的 int 进行无符号比较并导致无限循环:

#include <iostream>  

int main()
{
    unsigned int i = 0;
    while (i < 1000000)
    {
        printf("%o\n", i);
        ++i;
    }
    return 0;
}

我尝试改用这个:

#include <iostream>

int main()
{
    unsigned int i = 0;
    while (i < 1000000u)
    {
        printf("%o\n", i);
        ++i;
    }
    return 0;
}

我认为这会修复 signed/unsigned 比较,但事实并非如此,它仍然陷入无限循环。所以我也试着把它转换成unsigned int,没有骰子,仍然是无限循环。

使用Visual Studio2015,全面优化,发布编译器。

这是因为int类型溢出。请参阅类型 limits。对于如此庞大的数字比较,您应该使用 long 而不是 int

虽然我无法在 Win7 或 Ubuntu(均为 64 位)上重现无限循环,但我认为问题在于您的 printf() 函数具有无符号八进制数表示形式,这让您认为它进入了一个无限循环。将 %o 参数更改为 %u 可能会澄清问题。