【问题标题】:working of range for loop and C-style arrays in C++ [duplicate]C ++中循环和C样式数组的范围[重复]
【发布时间】:2020-06-02 14:29:23
【问题描述】:

C 风格的数组不是自描述的,因为它没有任何关于它的大小的信息,所以为了迭代它的元素,我们需要以某种方式的大小信息。我对 range-for 循环如何获取大小信息感到困惑。预计会失败。考虑两个相互矛盾的例子,

#include <iostream>
using namespace std;

int main() { 
    int a[] = { 1, 2, 3, 4, 5, 6 };
    for(auto x : a)
        cout<<x<<" ";
    cout<<endl;
    return 0;
}

它运行成功(意外),但是

#include <iostream>
using namespace std;

void print_a(int*);

void print_a(int a[])
{
    for(auto x : a)
        cout<<x<<" ";
    cout<<endl;
}
int main() { 
    int a[] = { 1, 2, 3, 4, 5, 6 };
    print_a(a);
    return 0;
}

这产生了错误(预期)。

有人能解释一下 range-for 循环是如何工作的吗?

【问题讨论】:

  • “C 风格的数组不是自描述的,因为它没有关于它的大小的任何信息”这是不对的。它确实包含这些信息(隐含地 - 它没有存储在任何地方,但编译器知道它),但数组在传递给函数时会衰减为指针。
  • @Yksisarvinen 但实际上获取有关大小的信息的范围
  • 在第一个示例中,编译器可以看到a 是一个数组并且具有该数组的大小,因此可以计算出for 循环可以迭代的范围。我假设您不需要解释为什么第二个示例不起作用。
  • How does the range-based for work for plain arrays?cppreference for range-based loops。简而言之,在基于范围的 for 循环中使用 C 风格的数组时会单独处理。请注意,它仅适用于实际数组类型,不适用于衰减为指针的数组。
  • 然而,编译器可以检查数组的定义以获得它的大小。如果只给出一个指针(它可以指向单个值,或者指向任意数量的值中的第一个),它就无法做到这一点。

标签: c++ loops c++11 c++14 c++17


【解决方案1】:

range-for 循环从头到尾运行,表示它需要知道长度。 静态分配的数组 AKA int array[10] 编译器知道编译时的长度,所以他知道终止它们, 但是在动态分配的数组上,编译器不知道数组的长度,所以他不能循环它们

【讨论】:

  • 这并不完全正确,因为静态分配的数组可能会衰减为指针,从而丢失有关其长度的信息。这个问题中的代码就是一个很好的例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2020-10-30
  • 2013-06-21
  • 2021-11-10
  • 2013-01-04
相关资源
最近更新 更多