【问题标题】:How to understand auto deduce in for loop? [duplicate]如何理解 for 循环中的自动推断? [复制]
【发布时间】:2021-10-27 08:42:50
【问题描述】:

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;
}

【问题讨论】:

  • 尝试将i &gt;= 0 更改为i &gt; 0nums.size() 返回size_type,这是一个无符号类型。将其递减到超过 0 可能会导致垃圾值可能不适用于您的情况。
  • nums.size() 是无符号的,所以size 是无符号的,所以i 是无符号的,所以i &gt;= 0 始终为真,减零会给你一个巨大的数字..
  • @Tharsalys 无符号下溢和上溢是明确定义的,不会产生“垃圾”(尽管结果通常与上下文中的垃圾一样有用)。

标签: c++ type-deduction


【解决方案1】:

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

auto i = 2 * size - 1;,因为sizeunsigned int,所以编译器决定将i 设为unsigned int,所以i &gt;= 0 始终为真。尝试减少它会导致环绕(到4294967295)并减少它。

【讨论】:

  • nums.size()std::vector&lt;int&gt;::size_type 不是 unsigned int。它总是未签名的。它更有可能是size_t
  • @MikeVine 和size_t 可能只是unsigned int 的别名;)
【解决方案2】:

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

i 被推断为与size 相同的类型,size 被推断为size_t 类型,因为vector::size() 返回size_t

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

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

到无限和超越。

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

【讨论】:

  • 无符号整数不会溢出,它们会环绕
  • @463035818_is_not_a_number 如果您使用 32 位无符号整数执行 0xFFFFFFFF + 1,它们可能会溢出,但在这种情况下 (0 - 1),我同意环绕是一个更好的术语。
  • > 所以 i = 0 总是正确的。
  • @douyu 是的,错字已经在队列中有建议的编辑
猜你喜欢
  • 1970-01-01
  • 2020-07-17
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多