Как цикл for перебирает массив? - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь понять логику того, как цикл for выполняет итерацию массива.Возьмите этот пример, в котором я буду использовать Java:

int[] numbers = {5, 6, 7};

for(int i = 0; i < number.length; i++) {
    System.out.println(numbers[i]);
}

Я не понимаю, как печать numbers[i] циклически перебирает массив.В частности, я не понимаю, как i представляет содержимое массива.

Ответы [ 6 ]

0 голосов
/ 20 сентября 2018

Строка for(int i = 0; i < number.length; i++) является вашей подсказкой.

Цикл for, который вы объявляете здесь, задает три параметра *: переменная инициализации, когда продолжить цикл и что делать после каждогоитерация:

  • int i = 0 - переменная инициализации.Это целое число со значением 0, которое существует только внутри цикла for.
  • i < number.length сообщает циклу for, что он должен продолжать выполнять любые операции внутри цикла for, пока выполняется это условие.В этом случае это означает, что до тех пор, пока i меньше «длины» (или «размера») вашего массива numbers, он должен продолжать работать.То есть, пока i меньше 3.
  • i++ сообщает циклу for, что делать после каждой итерации.В этом случае вы говорите for-loop увеличить переменную i на 1.
  • System.out.println() - это метод, который печатает данные в терминал, описанный
  • numbers[i]что вам нужен любой элемент в i-ом индексе в массиве numbers.То есть, когда i равно 2, вам нужен элемент во втором индексе.Когда i равен 1, вы хотите, чтобы он был в 1-м индексе. Важное примечание : массивы Java имеют нулевой индекс , что означает, что первый элемент в массиве имеет индекс 0, второй элемент имеет индекс 1 и т. Д.

То, что происходит в вашем цикле, другими словами, вы объявляете цикл, что должно быть целое число i с начальным значением 0, что он должен продолжать работать до тех пор, пока i меньше 3, что при каждом запуске он должен увеличивать i на 1, и при каждом запуске цикла он должен печатать элемент с индексом i в массиве numbers.

-

* «параметр», вероятно, не является правильной терминологией.

0 голосов
/ 20 сентября 2018

Ниже приводится описание того, как выполняется цикл for (получено из этого руководства по сертификации )

Имена, как указано ниже:

for(initialization code; 
    boolean expression; 
    update statements){
  body
}. 

Части цикла for выполняются в следующей последовательности:

  1. Код инициализации
  2. Если логическое выражение истинно, выполнить тело, иначе выйти из цикла
  3. Тело выполняет
  4. Выполнение операторов обновления
  5. Возврат к шагу 2

Поэтому применительно к вашему примеру мы можем сказать:

Выполнить инициализацию:

int i = 0

Итерация 1:

if(i < number.length) // -> if(0 < 3)
//run body
i++ //i becomes 1
//return to step 2 (new iteration)

Итерация 2:

if(i < number.length) // -> if(1 < 3) //i was incremented to 1
//run body
i++ //i becomes 2
//return to step 2 (new iteration)

Итерация 3:

if(i < number.length) // -> if(2 < 3) //i was incremented to 2
//run body
i++ //i becomes 3

Итерация 4 (не запущена):

//return to step 2 (new iteration)
if(i < number.length) // -> if(3 < 3)  -> condition not met
//condition not met, stop the loop

Более конкретно, я не понимаюкак я представляю содержимое массива

Как вы можете видеть выше, каждый раз, когда завершается выполнение тела цикла, выполняются операторы обновления, что делает i variable increment, что позволяет получить доступ к другому индексу массива.

Это сделано разумно, если вы измените свои операторы обновления на i += 2, то некоторые индексы массива будут пропущены.

0 голосов
/ 20 сентября 2018

Я собираюсь использовать немного другую аналогию, поскольку многие ответы дают вам правильную информацию.

Массив - это просто список последовательных блоков, содержащих значения.Представьте, что это список домов, каждый из которых пронумерован от 0 (массивы в Java, как и во многих других языках программирования, начинаются с 0, а не с 1) до n (в вашем случае это 2).

Таким образом, если бы вы собирали пожертвования из каждого дома, вы начинали с первого дома, 0, затем переходили к следующему дому 1, затем к следующему дому 2. Вы бы отслеживали, какой домпосещают сейчас, так что вы также знаете, какой следующий, и именно это делает целочисленная переменная i.

Печать numbers[i] не делает цикл цикла, так же какстук в первый дом не означает, что вы будете стучать во второй дом.

Цикл for отслеживает, какие номера домов вам нужно посетить в следующем.Он делает это с помощью 3 утверждений, которые он имеет в одной строке:

for(int i = 0; i < number.length; i++)

Первое утверждение говорит о начале с первого дома (int i = 0).Вы можете начать, где хотите.

Второе утверждение гласит: вы хотите идти до последнего дома, независимо от того, сколько домов там.(* * Тысяча двадцать одна).Это буквально переводит продолжать цикл, пока i меньше, чем размер массива .Вы можете спросить, почему это не условие <=.Это потому, что мы начинаем с 0, поэтому длина (размер массива) будет номером последнего дома + 1. В вашем случае, length = 2 + 1.

Третье утверждение, это то, что делаетВы переезжаете в следующий дом.i++ - сокращение от i = i + 1.Это утверждение выполняется после каждой итерации цикла.

Таким образом, по существу, ваш цикл for сначала инициализирует i в 0, проверяет условие (второе выражение) и, если условие выполняется, выполняет первую итерацию, а затем, наконец,увеличивает i, чтобы начать другую итерацию, если второе условие все еще выполняется.Этот цикл повторяется до тех пор, пока второе выражение вашего выражения for больше не будет истинным.

Наконец, все numbers[i] означает, что, поскольку numbers является массивом, оператор [ ] обращается к значениюпо указанному индексу.Так что это все равно, что стучать в дом с номером i, чтобы посмотреть, кто там живет.При подаче значения на System.out.println() это значение выводится на экран.

0 голосов
/ 20 сентября 2018

Чтобы получить доступ к информации из массива, мы должны сообщить массиву, к какой части мы хотели бы получить доступ.Для этого мы используем синтаксис

array[index]

Когда вы используете цикл for для циклического перемещения по массиву, вы, по сути, используете массив [index] для перехода от первого элемента к последнему.

for (int i = 0; i < array.length; i++) 

Начинается с массива [0] и переносится в массив [lastElement], распечатывая каждый элемент массива.

0 голосов
/ 20 сентября 2018

Значения массива извлекаются с помощью синтаксиса

numbers[index];

Индекс массива начинается с 0, а затем с 1 следующих 2 .... Таким образом, для получения 1-го элемента вам нужно

numbers[0];

Тем временем внутри цикла for вы создали блочную переменную с именем i.Обратите внимание, что во время итерации значение i увеличивается на 1 из-за i++.

Так что в вашем цикле for это происходит.

numbers [0];
numbers[1];
numbers[2];

Я думаю, чтоВы не понимаете, как работает цикл for.Пожалуйста, прочитайте,

Согласно этой статье,

for(initialization; condition ; increment/decrement){
   statement(s);
}

enter image description here

Пример (Это не Java, это JavaScript, но цикл for работает аналогично; не не поймите меня неправильно. Я просто хочу показать вам рабочий пример того, как i увеличивает значение.) :

var i;
for (i = 0; i < 10; i++) {
  console.log("i = " + i);
}
0 голосов
/ 20 сентября 2018

"Массивы всегда будут размещаться в памяти с использованием последовательных мест хранения. Компилятор знает, что массив должен начинаться с ячейки памяти x. Когда ему нужно добраться до [123], он добавляет 123 к x и использует это число дляадрес памяти, чтобы добраться до элемента. "

Они идут последовательно, и индексация начинается с 0. И у каждого нового элемента следующая позиция после текущего индекса.следовательно, вы можете получить доступ к любому элементу из массива с его индексом.

Если вы пишете, numbers[i] означает i-й элемент из массива.и всегда самый высокий индекс массива всегда будет меньше длины массива (размер массива).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...