2015-08-22 5 views
-5

Я пробовал под кодом код {2,3,3}. Я не могу объяснить, почему значение первого элемента было изменено. Я полагаю, что это эффект сглаживания, но смущенный.Почему i ++ произошел первым?

int[] arr = new int[] { 1, 2, 3 }; 
int i = 0; 
while (i < arr.length - 1) { 
    arr[i++] = arr[i]; 
} 
i = 0; 
while (i < arr.length) { 
    System.out.println(arr[i]); 
    i++; 
} 
+0

Что вы имеете в виду под "* псевдоним эффекта *"? –

+0

Я не могу объяснить результат. Я знаю, что моя мысль может быть неправильной, поэтому ждите здесь правильного объяснения. – Peterxwl

ответ

1

Значение первого элемента изменяется на величину второго элемента, так как линия arr[i++] = arr[i]; фактически выполняется, как это:

arr[0] = arr[1]

Это означает, что первое значение массива (помните, что индексирование массивов начинается с 0) массива, который в этом случае равен 2. Оператор ++ увеличивает счетчик только после его использования в качестве фактического значения без его увеличения.

После первого цикла корыта первого в то время как петля вашего массив выглядит следующим образом: [2,2,3] с i быть 1 Тогда arr[1] = arr[2] становится казнен, который изменяет массив: [2,3,3] с i быть 2 То есть конечный результат.

+0

Почему я не могу дождаться окончания этой строки? Я думаю, что это одна команда, и я могу увеличивать ее после выполнения команды. – Peterxwl

+0

Инкремент i происходит сразу после использования i ++. Таким образом, сначала получает доступ к массиву в позиции i, тогда я получаю инкремент, и массив в позиции i + 1 получает доступ во второй части инструкции. –

+1

Также стоит ссылаться на [«Учебники Java»> «Назначение, арифметика и унарные операторы»] (https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op1.html) и [JLS § 15.14.2: Postfix Increment Operator ++ "] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.14.2) –

0

Если мы делаем шаг через первую петлю (arr.length = 3)

first: i < 3 - 1 : 0 < 2 => true 
arr[0] (increments i, i is now 1) = arr[1] => arr[0] = 2; 
arr is now {2, 2, 3} 

second time in loop: i < 3 - 1 : 1 < 2 => true 
arr[1] (increments i, i is now 2) = arr[2] => arr[1] = 3 
arr is now {2, 3, 3} 

third loop check: i < 3 - 1 : 2 < 2: false; exit while loop; 

Print out array: {2, 3, 3} 
+0

Почему я не могу дождаться окончания эта строка? Я думаю, что это одна команда, и я мог бы увеличивать ее после выполнения команды – Peterxwl

Смежные вопросы