如何理解for循环中的auto deduce?

How to understand auto deduce in for loop?

i初值不等于5,输出无数个数

int main() {
  vector<int> nums = {1, 2, 1};
  auto size = nums.size();
  for(auto i = 2 * size - 1; i >= 0; i--) {
    // do_stuff()
    std::cout << i << " ";
  }
  std::cout << std::endl;
  return 0;
}

因为nums.size()std::size_t,是unsigned int的别名,所以sizeunsigned int

auto i = 2 * size - 1;,因为 size 是一个 unsigned int,所以编译器决定让 i 成为一个 unsigned int,所以 i >= 0 总是真的。试图减少它会导致环绕(到 4294967295)并减少它。

您的问题源于 i 的类型是无符号的,因此 i >= 0 始终为真,导致循环无限。

i 被推导为与 size 相同的类型,而 size 被推导为 size_t 类型,因为 vector::size() returns size_t.

由于上述原因,无符号整数溢出,你的循环是无限的。它打印 (*)

5 4 3 2 1 0 4294967295 4294967294 4294967293 ... 3 2 1 0 4294967295 4294967294 ...

无限远。

(*) 如果 size_t 在您的平台上是 32 位。