【问题标题】:Weird issue with range based for loop基于范围的for循环的奇怪问题
【发布时间】:2016-04-01 14:51:34
【问题描述】:

我正在我的 C++ 面向对象 1 类中学习向量,我们已经引入了基于范围的 for 循环的概念。我决定单独练习基于范围的 for 循环,以便习惯语法,但遇到了一个奇怪的问题。

 #include<iostream>
 using namespace std;
 int main()
 {
   int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
   for ( auto i: a)
     {
       cout << a[i] << " ";
     }

 return 0;
 } 

当我运行上面的代码时,我的输出如下。

2 3 4 5 6 7 8 9 0 1 按任意键继续...

我的输出应该是

1 2 3 4 5 6 7 8 9 0 按任意键继续...

谁能告诉我为什么我的第一个索引被跳过了?我有视觉工作室 2013 专业版。

【问题讨论】:

  • 你不应该打印a[i],而应该只打印i
  • 基于范围的 for 循环遍历元素,而不是数组的索引
  • i 不是 a 的索引,而是 a 的第一个值,尽管每次循环 i 都是 a 的下一个值。将类型 a 更改为字符串,你的 a[i] 不会编译,
  • 您刚刚发现了一种出色的代码混淆技术! :-)
  • @RichardHodges,这就是 JavaScript 的工作原理,顺便说一句。前几天,当我需要对一些 Web 脚本做一些小改动时,我已经准备好了。最后我意识到每个循环的 JS 迭代索引(或 assoc 数组中的键),而不是值!他们在 ECMA 脚本中有更新版本,它迭代值 - 但当然,我们的 IE 版本不支持。

标签: c++ arrays ranged-loops


【解决方案1】:

您会得到奇怪的输出,因为 range 循环中的 i 是数组中的值,而不是索引。也就是说,

for (auto i : a)

循环遍历a。在您的代码中,您实际上是在打印序列a[a[0]]a[a[1]] 等。

你可能想要的代码是

for (auto i : a) {
    std::cout << i << std::endl;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 2014-12-06
    相关资源
    最近更新 更多