2 차원 배열 이니셜 라이저와 대괄호
이 코드를 이해하는 데 문제가 있습니다.
int[] it = new int[][]{{1}}[0];
컴파일 가능한 이유는 무엇이며 이러한 선언을 어떻게 이해할 수 있습니까?
여기서하는 일은 다음과 같습니다.
- 새 변수 선언
int[] it
(1 차원 배열) - 첫 번째 요소에서 값 할당
[0]
- 2 차원 배열의
new int[][]
- 초기화되는
{{1}}
따라서 포함하는 배열을 포함하도록 초기화하는 2 차원 배열을 만들고 1
동시에 외부 배열 의 첫 번째 요소 (를 포함하는 1 차원 배열 1
) 를 가져와 변수에 할당합니다.
int[] it = new int[][]{{1}}[0];
이것을 각 단계로 나누고 그 의미를 봅시다.
new int[][]
이것은 새로운 다차원 배열입니다.
{{1}}
이것은 다차원 배열 리터럴입니다. 다음과 같은 배열을 만듭니다.
[0] = [1]
[1] = []
[2] = []
...
[N] = []
따라서이 배열 내부의 각 요소는 그 자체가 배열입니다. 그런 다음 변수 it
가 다차원 배열의 첫 번째 배열과 같도록 지정 했으므로 다음과 직접 동일합니다.
int[] it = new int[] {1};
new int[][]{{1}}
할당하는 신규의 1x1 2D 배열. (유일한) 요소는 1로 설정됩니다.
는 [0]
타입 인 제 (그리고 유일한)의 행에 대한 참조를 반환한다 int[]
.
는 int[] it = ...
변수를 선언하고, 상기 기준으로 초기화.
최종 결과는 int[] it = new int[]{1}
.
기본적으로 익명의 2 차원 배열 ( new int[][]{{1}}
)을 만든 다음 해당 2 차원 배열 ( {1}
) 의 첫 번째 요소를 가져와 변수에 할당합니다 it
.
실제로는 다소 혼란 스럽기 때문에 단계별로 진행해 보겠습니다.
new int[][]{{1}}
: 이렇게하면 요소가 하나만있는 2 차원 배열이 생성됩니다. 하나의 배열을 포함하는 배열 int
(숫자 1) 이 하나만 포함 됩니다. 변수에 할당되지 않고이 문을 지나서 액세스 할 수 없기 때문에 "익명"이라고 부르며 가능한 가장 작은 범위를 갖습니다.
[0]
: 위에서 만든 익명의 2 차원 배열의 첫 번째 요소에 액세스합니다. 첫 번째 요소는 인 한 1 차원 배열을 포함하는 (즉, {1}
).
int[] it =
: 마지막으로, 여기에서 검색된 1 차원 배열을 가져와 변수에 저장합니다.
참고로 이런 식으로 할 이유가 전혀 없으며 매우 흥미로운 자바 퍼즐처럼 보입니다.
나는 그것을 분해하려고 노력할 것입니다
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];
int[] it = new int[][]{{1}}[0];
정수 배열 it
에는 다음이 할당됩니다.
new int[][] // A new 2D array is created
{{1}} // This is an initializer. The first array in the first array gets an array of 1 item: '1'
[0] // Take the first array from the 2D array
'code' 카테고리의 다른 글
목록에 고유 항목 만 추가 (0) | 2020.11.07 |
---|---|
ASP.Net MVC 뷰에서 컨트롤러로 데이터를 전달하는 방법 (0) | 2020.11.07 |
Windows의 bash 스크립트에서 Openssl 실행-제목이 '/'로 시작하지 않음 (0) | 2020.11.07 |
데이터 프로토콜 URL 크기 제한 (0) | 2020.11.07 |
C # Linq Where Date Between 2 Dates (0) | 2020.11.07 |