我在练习数组问题,我坚持这一个:
给定2D数组的声明:
int a[][2] = { {2,2}, {3,3}, {4,4} };
写一个嵌套的for循环来打印a的所有值。
首先,由于2D数组是一个行数组(意味着这个数组的每个元素都是一个行向量),
我尝试了一个for循环,像这样:
for (int& x[]: a)
for (int y: x)
cout << y << " ";
外部for循环意味着我想引用a的每一行,给它一个名字"x";内部for循环意味着我要引用x的每个元素,给它一个名字&;y&;
我认为外部for循环中的声明是有效的,因为我指定x为整数类型的数组,但在编译时出现错误。我检查了解决方案,它表明x必须声明为自动类型,这意味着我应该把外循环写成"for(auto& x: a)
"。这个解决方案也表明这是唯一的方法,但我不确定这是否是真的。
因此,我想弄清楚几件事:
- 为什么当我写"
for (int& x[]: a)
";? - "行x的数据类型是什么?
for (auto& x : a)
";?auto检测到什么? 在这种情况下,使用auto真的是唯一的方法吗?
谢谢!
-
在
for (int& x[] : a)
中x
是一个引用数组。引用数组在c++中是不合法的。 -
类型为
int[2]
。 -
您可以通过写入
for (int (&x)[2] : a)
来避免auto
。&x
周围的额外括号是至关重要的,没有括号,你有一个引用数组(不合法),有了括号,你有一个对数组的引用。
正如john所说:
#include <iostream>
int a[][2] = { {2,2}, {3,3}, {4,4} };
int main()
{
for (int(&x)[2] : a) // one row at a time
{
for (int x2 : x) // print each col in row
{
std::cout << x2 << " ";
}
std::cout << 'n';
}
}
或者直接使用auto
#include <iostream>
int a[][2] = { {2,2}, {3,3}, {4,4} };
int main()
{
for (auto& x: a) // one row at a time
{
for (auto x2 : x) // print each col in row
{
std::cout << x2 << " ";
}
std::cout << 'n';
}
}