Массивы 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?
Спасибо заранее.
Ответы
Ответ 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'.
Это мое понимание. Пожалуйста, дайте мне знать, если это не так.
Спасибо,