【发布时间】:2020-05-19 11:44:10
【问题描述】:
为了在 C++ 中循环一个名为“a”的 3x3 数组,我使用了以下代码。
int a[3][3] {};
for(auto &b: a) {
for(auto &c: b) {
std::cout << c << std::endl;
}
}
如果我必须替换“自动”,我会直观地尝试
int a[3][3] {};
for(int &(b[3]): a) {
for(int &c: b) {
std::cout << c << std::endl;
}
}
但这不起作用。相反,我发现以下工作。
int a[3][3] {};
for(int (&b)[3]: a) {
for(int &c: b) {
std::cout << c << std::endl;
}
}
所以问题是:为什么后一个例子有效?
我以为我需要一个长度为 3 的数组的引用,但我需要一个包含引用的长度为 3 的数组。
【问题讨论】:
-
int (&b)[3]这是对int[3]的引用。这是一个棘手的语法。所以你确实有一个长度为 3 的数组的引用。 -
很遗憾,您的“阅读”是错误的,
int &(b)[3]被解析为引用数组,而int (&b)[3]是对大小为 3 的数组的引用。(请参阅stackoverflow.com/questions/5724171/…) -
因为
for(int i=0; i<3; i++) for(int j=0; j<3; j++) { std::cout << a[i][j] << std:endl;太容易阅读和简单了。因此,让我们尝试将快速、可读的代码转换成遗忘,C++1x 提供了所有工具。如果机器代码也变慢,则加分。 -
我觉得
int (&b)[3]: a还是太可读了。你有什么想法让它更难读吗? -
使用 I3 = int[3]; for(I3 &b: a) { // 当我看起来像 1 时,这里看起来更糟。