Подтвердить что ты не робот

Массивы Java. Почему вывод "1"?

Почему вывод в этом примере 1?

public static void main(String[] args){
 int[] a = { 1, 2, 3, 4 };   
 int[] b = { 2, 3, 1, 0 };   
 System.out.println( a [ (a = b)[3] ] );   
}

Я думал, что это будет 2. Например, выражение оценивается как:

a[(a=b)[3]]
a[b[3]]    //because a is now pointing to b
a[0]   

Не должно быть [0] равно 2, потому что a указывает на b?

Спасибо заранее.

4b9b3361

Ответ 1

Это тоже странно... но, проверьте раздел 15.7.1 над здесь

По сути, операнды оцениваются слева направо. Но также обратите внимание на это:

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

Ответ 2

Аргументы для каждого оператора оцениваются слева направо. I.e., a перед [...] оценивается до его содержимого, после чего он все еще относится к первому массиву.

Ответ 3

a [ (a = b)[3] ] )

интерпретируется следующим образом:

a = b => a = {2, 3, 1, 0};
( a = b )[3] => 0;

Вот трюк здесь: a оценивается как значение, которому предшествует b.

a[(a = b)[3]) => a[0] = 1;

Подумайте о приоритете оператора в Java. Это должно быть немного более очевидным.

Ответ 4

Как отметил Марсело Кантос, аргументы для каждого оператора оцениваются слева направо. Поэтому я думаю, что выполнение

a[(a=b)[3]]

Здесь внешний "a" будет извлекать "1,2,3,4", а затем оценивается его аргумент (a = b) [3]. Таким образом, теперь возвращается a = b и возвращается элемент с индексом 3 в массиве b, который также указывает на.

Следовательно, мы получаем "0" из оценки аргумента. Как было сказано ранее, внешнее a по-прежнему относится к старому содержимому. Таким образом, дает [0] в массиве 1,2,3,4.

Поэтому мы получаем '1'.

Это мое понимание. Пожалуйста, дайте мне знать, если это не так.

Спасибо,