Как присваивание работает в многомерных массивах в java?

class Test {
public static void main(String[] args) {
int i = 4;
int ia[][][] = new int[i][i=3][i];
System.out.println(ia.length + ", " + ia[0].length + ia[0][0].length);
}
}

Я бы подумал, что 3, 4, 3 были бы напечатаны вместо правильного ответа: «4, 3, 3». Переменная ia имеет 3 массива, так почему ia.length не 3?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
40
2

Ответы 2

Длина равна 4, потому что вы инициализируете i до 4 в строке перед инициализацией массива.

Итак, заменяя i фактическими значениями, которые вы делаете

int ia[][][] = new int[4][3][3];

Кроме того, я бы подумал, что присвоение i нового значения одновременно с инициализацией массива будет плохой практикой (удобочитаемость).

Более того, ia не «имеет 3 массива», это трехмерный массив.

но ia [0] должно быть 4, верно? он печатает 3. не могли бы вы объяснить почему?

Shahid Sarwar 30.03.2018 14:40

Ну нет, ia [0] содержит int [3] [3] в вашем примере, поэтому длина 3

tom 30.03.2018 14:46
i имеет длину 4. Каждый из этих четырех элементов - это int[3][3] - это массив длиной 3, а каждый из те является массивом длины 3. Каждый из i[0], i[1], i[2], and i[3] имеет длину 3. Спускаясь на один уровень вниз, каждый из их элементов ( например, i[2][0]) имеет длину 3.
Prune 30.03.2018 18:20

Согласно 15.10.2. Оценка во время выполнения выражений создания массива

First, the dimension expressions are evaluated, left-to-right. If any of the expression evaluations completes abruptly, the expressions to the right of it are not evaluated.

Это простой случай без исключений, применяется только часть правила слева направо. Итак, чтобы оценить new int[i][i=3][i], необходимо выполнить следующие шаги:

  1. Оцените i (дает 4)
  2. Оцените i=3 (установив i на 3, что даст 3)
  3. Оцените i (результат 3, поскольку на предыдущем шаге было установлено значение 3)

Следовательно, размеры, с которыми создается массив, равны 4, 3, 3.

Спасибо, я понял это, но я все еще не понимаю, почему ia [0] .length печатает 3, а не 4. Пожалуйста, объясните мне это.

Shahid Sarwar 30.03.2018 14:48

@ShahidSarwar 4 - это длина самого ia. Здесь всего одна 4, все остальное - 3.

harold 30.03.2018 14:50

Другие вопросы по теме