【发布时间】:2012-07-22 05:49:45
【问题描述】:
数组初始化器可用于在编译时初始化数组。如下所示的带有尾随逗号的初始化程序可以正常编译。
int a[][] = {{1,2,} ,{3,4,} , {5,6,},}; //Trailing commas cause no compiler error
for(int i=0;i<a.length;i++)
{
for(int j=0;j<2;j++)
{
System.out.print(a[i][j]+"\t");
}
System.out.println();
}
输出:
1 2
3 4
5 6
与上面的讨论一样,一维数组也是合法的。
int[] b = {1, 2, 3, 4, 5, 6,}; //A trailing comma causes no compiler error
for(int i=0;i<b.length;i++)
{
System.out.print(b[i]+"\t");
}
输出:
1 2 3 4 5 6
即使以下是合法的语法,也可以正常编译。
int c[][] = {{,} ,{,} , {,},};
编译器应该期望在逗号, 之后和之前有一个常量值(或另一个初始化程序)。这是如何编译的?编译器是否只是忽略了这样的逗号或在这种情况下发生了其他事情?
【问题讨论】:
-
忽略尾随逗号。语言允许这样做,因为有些人觉得它很方便。
-
@Daniel 好吧,它在向数组添加内容时使差异更加简洁,允许轻松重新排序数组表达式,并一次性为该语言提供更简单的语法。我看不出有很多优点,但没有缺点。
-
@Voo 如何让语法更简单?如果尾随逗号是强制性的,那会更简单,但是如果有一个可选的尾随逗号,我看不到它。我也看不到差异更简洁。重新排序,是的。
-
@Daniel 对,你是关于语法的,我忘了它们仍然是可选的。关于差异:假设对于较大的数组,每个项目都有自己的行(我经常看到,虽然它并不总是明智的,但在很多情况下它很有用 - 也为 cmets 留出了位置,而不诉诸 /* */ 内联) .添加一个新行然后只会更改差异中的一行,没有它你必须更改两个。
-
@Voo 我明白了。但是,如果您以 Haskell 样式布置数组,并使用前导逗号,它不会更改两行 - 除非您在第一个位置添加一个条目,但这比在末尾添加要少得多。
标签: java arrays multidimensional-array