我在理解这段代码时遇到问题:
int[] it = new int[][]{{1}}[0];
为什么它是可编译的,我怎么能理解这样的声明?
我在理解这段代码时遇到问题:
int[] it = new int[][]{{1}}[0];
为什么它是可编译的,我怎么能理解这样的声明?
int[] it = new int[][]{{1, 2}, {3, 4}}[0];这不是很常见,但是它也不是最不可读的代码。
Answers:
您在这里所做的是:
int[] it(是一维数组)[0]new int[][]{{1}}因此,您创建了一个二维数组,将其初始化为包含一个包含的数组,1同时您将外部数组的第一个元素(包含的一维数组1)作为元素,并将其分配给变量。
{{1}}是简单地将单个1成多维的。这样的声明有什么用?
int[] it = new int[][]{{1}}[0];
让我们将其分解为每个阶段以及它的含义。
new int[][]
这是一个新的多维数组。
{{1}}
这是一个多维数组文字。它使数组看起来像这样:
[0] = [1]
[1] = []
[2] = []
...
[N] = []
因此请注意,此数组内的每个元素本身就是一个数组。然后,您指定了变量it等于多维数组中的第一个数组,因此它直接等于:
int[] it = new int[] {1};
{{1}}[…]组成的数组看起来像这样:[…][10] = [] ”具有误导性:没有这样的事情,[10]因为外部数组的大小仅为1,因此唯一的元素位于索引0(并且包含如您正确所述,另一个大小为1的数组,其中包含整数1。虽然我已经开始挑剔,但我认为您错过了最后一行的更新(应该是{1},不是{0})。最后一点,只是为了好玩:您甚至可以将行缩短为just int[] it = {1};(这仅在声明数组变量时有效,在所有其他情况下都需要new int[]{…})。
{1}批评是有效的。随着0-10我是想说明的一点是它的其余部分是空的..我做到了。干杯。
在new int[][]{{1}}分配新的1x1 2D阵列。(仅)元素设置为1。
将[0]返回到第一个(并且只有)行,这是类型的引用int[]。
该int[] it = ...声明一个变量,并与上述参考文献对其进行初始化。
最终结果等于int[] it = new int[]{1}。
本质上,您将创建一个匿名二维数组(new int[][]{{1}}),然后获取该二维数组()的第一个元素,{1}并将其分配给变量it。
让我们一步一步走,因为这实际上有点令人困惑。
new int[][]{{1}}:这将创建一个只有一个元素的二维数组:一个数组,其中包含一个数组,其中一个数组包含一个int(数字1)。由于未在任何地方将其分配给变量,并且无法通过此语句访问,因此我们将其称为“匿名”,并且其范围可能最小。
[0]:这将访问我们在上面创建的匿名二维数组的第一个元素。第一个元素是包含1(即)的一维数组{1}。
int[] it =:最后,在这里,我们将获取的一维数组存储在变量中。
附带说明一下,绝对没有理由这样做,这似乎只是一个非常有趣的Java难题。
我会尽力分解
new int[][] // an array of arrays (or 2-dimensional array)
{1} // an array instance with a single element: 1
{{1}} // an array instance with a single element: above array instance
[0] // the first element of an array
因此,它大致等效于以下代码:
int[] inner = new int[1]; // an empty array with length 1
inner[0] = 1;
int[][] outer = new int[1][];
outer[0] = inner;
int[] it = outer[0];