почему при выводе в начале мы получаем 0, если мы i присвоили 1? (result[i] = new int[i + 1]; result[i][j] = i + j;) ??
for (int i = 0; i < 10; i++) {
result[i] = new int[i + 1];
for (int j = 0; j < result[i].length; j++) {
result[i][j] = i + j;
System.out.print(result[i][j] + " ");
}
System.out.println();
}
}
}
Anonymous #2632922
35 уровень
объясните пожалуйста
Решен
Комментарии (14)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Кирилл Java Developer
8 декабря 2021, 07:19
1 присвоили не i. Вот что происходит в строчке на первом проходе, которая тебе интересна:
result[0] (первый элемент массива) = new int[0 +1] (новый массив с 1 ячейкой).
То есть ты ранее созданному двумерному массиву заменяешь ячейку под номером 0 состоящую из ранее заданного тобою кол-во ячеек, на новый подмассив, состоящий из 1й ячейки.
0
Anonymous #2632922
8 декабря 2021, 14:01
при выходе из первого цикла чему равна переменная i ?
0
hidden #598481
8 декабря 2021, 07:10
Где ты i присвоил 1? Подсказка: оператор присваивания - это "=".
У тебя объявлены два цикла, в первом i инициализирована нулем, во втором - j инициализирована нулем. И в массив кладется их сумма, отсюда и ноль.
как ты понимаешь эту строчку, что здесь написано? Объясни своим языком. 0
Anton
8 декабря 2021, 08:33
я понимаю так: в ячейку номер [i] заношу целое число new int [ равное сумме числа (номера ячейки) и единицы ]. Неправильно?
0
hidden #598481
8 декабря 2021, 09:02
Нет.
Надо понимать, что такое result и соответственно result[i].
Здесь происходят три вещи:
1) объявлена переменная result типа int[][], то есть двумерный массив, или другими словами массив одномерных массивов.
2) new int[10][] - создан этот самый двумерный массив длиной 10, то есть в нем 10 элементов - массивов чисел.
3) созданный объект записан в созданную переменную (выполнено присваивание).
result - это массив, элементы которого тоже являются массивами.
Тогда что такое result[i]? Это элемент массива result, то есть массив чисел.
Что такое new int[i + 1]? Квадратные скобки говорят о том, что это не число, а массив, в квадратных скобках написана длина этого массива.
То есть происходит присваивание ячейкам внешнего массива значений из пустых одномерных массивов.
Создан массив одномерных массивов. Каждый элемент массива инициализирован null:
[null, null, null, null, null, null, null, null, null, null]
Каждому элементу присвоено значения массива чисел: Ну а во вложенном цикле ты каждому элементу всех дочерних массивов присваиваешь значение, равное сумме индексов. +2
Anton
8 декабря 2021, 09:07
Не спасибо, а спасибище! ))) Теперь понятно!!!
0
Anonymous #2632922
8 декабря 2021, 14:00
я вначале понял что при выходе из первого цикла а именно после result[i] = new int[i + 1]; i равно 1. и когда программа начнет складывать result[i][j] = i + j; он будет считать что i=1.
А теперь я понял что изменения в одномерном массиве переменной i result[i] = new int[i + 1]; не изменяет i в двумерном массиве и программа берет первичное заданное число int i = 0; и вычисляет, верно?
0
hidden #598481
8 декабря 2021, 14:41
Еще раз. Оператор присваивания - это знак "равно". Если есть знак равно, то ты величине слева от знака равно присваиваешь значение справа от знака равно.
Это присваивание
Означает "величина, равная и-плюс-одному". Ты вычислил, тут же использовал где-то (в качестве длины массива в данном случае) и сразу забыл.
Сравни с тем, если написать так (не надо так писать!):
Тут сначала i равно нулю, то есть ты обращаешься к result[0], затем выполняется правая часть, в частности сначала вычисляется содержимое скобок:
i = i + 1
то есть увеличенное значение записывается в переменную i, то есть после этой строчки i остается равно 1, и когда ты перейдешь к следующей итерации цикла, выполнится i++, и i станет равно 2. Из-за этого ты бы пропустил половину элементов двумерного массива:
Еще: неправильно говорить "при выходе из первого цикла". Первый цикл заканчивается после второго, смотри где у него фигурная скобка закрывается. Циклы никаким волшебным образом не управляют переменными, которые в них есть, все операции выполняются так же, как и вне циклов, по той же логике. 0
Anonymous #2632922
8 декабря 2021, 15:15
да это я понял. повторю вопрос почему в result[i][j] = i + j; i равно 0, если после result[i] = new int[i + 1]; i равно 1 ???
0
hidden #598481
8 декабря 2021, 16:23
Да нифига ты не понял.
Я тебе в предыдущем комментарии три абзаца объяснял чем i+1 отличается от i=i+1.
i+1 никак не изменяет значение i, чтобы изменить значение переменной нужен знак равно.
После i+1 сама i какой была, такой и осталась
0
Anonymous #2632922
8 декабря 2021, 16:59
result[i] = new int[i + 1] вот тут есть знак равно.
и первый цикл заканчивается после второго цикла, то есть объявляется одномерный массив в первом цикле и тут же присваивается ему значение во втором цикле
0
Anonymous #2632922
8 декабря 2021, 17:04
0
hidden #598481
8 декабря 2021, 17:32решение
И чему тут что присваивается?
Тут присваивается значение переменной result[i]. Переменная i это то же самое? Нет.
Чтобы присвоить значение переменной i надо написать i = новое значение.
Тут написано i = i + 1? Нет.
Тут написано просто i+1. Это выражение просто вычисляется в памяти компьютера и используется в качестве длины создаваемого массива. На i оно никак не влияет.
Представь, что у тебя есть 300 рублей, и ты хочешь что-то купить. Я тебе говорю, что эта вещь стоит на 100 рублей больше, чем у тебя есть. Сколько стоит вещь? 400 рублей.
У тебя количество денег изменилось? Нет, как было 300, так и осталось.
Если у тебя будет 400 рублей, то вещь будет стоить 500 рублей. Такая вот жизненная несправедливость.
Тут тоже самое.
+2
Anonymous #2632922
8 декабря 2021, 17:45
Тут присваивается значение переменной result[i].
вот теперь понял))) спасибо)))
0