汽车有什么问题?

Ion*_*dru 3 c++ vector auto

vector<int> function(vector<int> &arr)
{
    for(auto i = arr.size() - 1; i >= 0; i--)
        std::cout << arr[i] << " ";

    return arr;
}

int main()
{
    vector<int> arr{1,2,3,4};
    function(arr);
}
Run Code Online (Sandbox Code Playgroud)

为什么上面的程序会循环?如果我改变autoint一切正常

Bla*_*aze 8

arr.size()无符号数据类型,通常为size_t。随着i未签名,i >= 0永远是true1从一个无符号变量中减去0该类型可以容纳的最大数量。结果,它将永远循环。

然后发生的事情是不确定的,因为您的数组索引将变成一个巨大的值,并且arr[i]values 将具有未定义的行为>= arr.size()。如果你有一个int而不是auto,它会起作用,因为这i--将导致它最终是-1然后i >= 0将是false,退出循环。

可以在此处找到此翻转行为的解释:

无符号整数算术总是以 2 nn为模执行 ,其中是该特定整数中的位数。例如,对于 unsigned int,UINT_MAX给 ? 0?,然后从 ?0? 中减去 1?给UINT_MAX.

因此,对于size_t10结果中减去,结果SIZE_MAX通常为18446744073709551615