为什么 unsigned int 在最后一次迭代时会导致 for 循环崩溃?

nor*_*ner 1 c++ for-loop

以下程序会产生意想不到的结果

#include <iostream>
using namespace std;

int main() {
    for(unsigned int i = 10; i >= 0; i--)
    {
        cout << i << endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但更改unsigned int为仅int给出输出 10,9,8...,0

拥有 anunsigned int并使用它来迭代值 [n, 0] (包括)的正确方法是什么?我迭代数组的每个元素,但不想使用 foreach 语法,因为我需要一个变量来保存元素的位置。

joh*_*ohn 5

unsigned 变为负数,不正确。无符号算术环绕,因此在无符号算术中,如果从零减一,您将得到最大可能的无符号值。这取决于您的编译器,但如果您有 32 位整数,那么它将是 4294967295。

我不认为你的程序应该崩溃,我认为它应该永远循环,因为在无符号算术中i >= 0总是正确的。

顺便说一句,我编写该循环以使其正确使用无符号算术的方式是

for (unsigned int i = 11; i-- > 0; )
{
    cout << i << endl;
}
Run Code Online (Sandbox Code Playgroud)