首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何理解自动推理在循环中的应用?

如何理解自动推理在循环中的应用?
EN

Stack Overflow用户
提问于 2021-10-27 08:42:50
回答 2查看 104关注 0票数 0

初值i不等于5,输出数不清。

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-27 08:52:38

您的问题源于这样一个事实,即i的类型是无符号的,因此i >= 0始终是真的,从而使循环无限。

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

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

代码语言:javascript
复制
5 4 3 2 1 0 4294967295 4294967294 4294967293 ... 3 2 1 0 4294967295 4294967294 ...

无限和更远。

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

票数 0
EN

Stack Overflow用户

发布于 2021-10-27 08:50:52

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69735443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档