【发布时间】: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