a[b] = b = 5
От: Void666  
Дата: 27.08.10 12:41
Оценка:
Добрый день,

Сажите пожалуйста почему в Java, вот так вот
int b = 0;
int[] a = {5,5}
a[b] = b = 1;

даст такой результат:
a = {0,5}

а не,
a = {5,0}

?
Re: a[b] = b = 5
От: mazurkin http://mazurkin.info
Дата: 27.08.10 12:49
Оценка: 1 (1) +1
V>а не,
V>a = {5,0}

Потому что на самом деле это будет a={1,5}

Учитывая что так писать не надо, нельзя, некрасиво, недостойно — проблема и вопрос практической силы не имеют
Re[2]: a[b] = b = 5
От: Аноним  
Дата: 27.08.10 12:57
Оценка:
Здравствуйте, mazurkin, Вы писали:

V>>а не,

V>>a = {5,0}

M>Потому что на самом деле это будет a={1,5}


M>Учитывая что так писать не надо, нельзя, некрасиво, недостойно — проблема и вопрос практической силы не имеют


в каком месте спецификации указано что сначала должна вычислятся ссылка a[b], в таком случае ?
Re[3]: a[b] = b = 5
От: dimok@  
Дата: 27.08.10 13:16
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, mazurkin, Вы писали:


V>>>а не,

V>>>a = {5,0}

M>>Потому что на самом деле это будет a={1,5}


M>>Учитывая что так писать не надо, нельзя, некрасиво, недостойно — проблема и вопрос практической силы не имеют


А>в каком месте спецификации указано что сначала должна вычислятся ссылка a[b], в таком случае ?


Приоритет операций.
Re[3]: a[b] = b = 5
От: Blazkowicz Россия  
Дата: 27.08.10 13:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, mazurkin, Вы писали:


V>>>а не,

V>>>a = {5,0}

M>>Потому что на самом деле это будет a={1,5}


M>>Учитывая что так писать не надо, нельзя, некрасиво, недостойно — проблема и вопрос практической силы не имеют


А>в каком месте спецификации указано что сначала должна вычислятся ссылка a[b], в таком случае ?

http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#23958
Ну, и там же про остальное:
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.7
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#5281
Re: a[b] = b = 5
От: snoɯʎuouɐ  
Дата: 28.08.10 08:16
Оценка:
Здравствуйте, Void666, Вы писали:

V>Добрый день,


V>Сажите пожалуйста почему в Java, вот так вот
V>int b = 0;
V>int[] a = {5,5}
V>a[b] = b = 1;


V>даст такой результат:

V>a = {0,5}

Видимо, у тебя опечатка. Результат будет {1,5}.
Дело в том, что Java гарантирует, что операнды любых операторов (в т.ч. оператора присваивания) вычисляются слева направо, и вычисление самого оператора не происходит, пока не будут полностью вычислены его операнды. Таким образом, сначала вычисляется a[b] (со старым значением b), результатом чего является переменная — элемент массива с индексом 0, потом вычисляется b = 1, результатом чего является 1, а побочным эффектом — изменение значения b с 0 на 1. И наконец, вычисляется сам оператор присвивания, результатом чего является 1, а побочным эффектом — изменение значения ранее вычисленной переменной (элемента массива a с индексом 0) с 5 на 1. Результат оператора присваивания отбрасывается, а побочные эффекты мы наблюдаем.

15.7 Evaluation Order
The Java programming language guarantees that the operands of operators appear to be evaluated in a specific evaluation order, namely, from left to right.

15.7.2 Evaluate Operands before Operation
The Java programming language also guarantees that every operand of an operator (except the conditional operators &&, ||, and ? :) appears to be fully evaluated before any part of the operation itself is performed.


Однако JLS не рекомендует полагаться на эти тонкости:

It is recommended that code not rely crucially on this specification. Code is usually clearer when each expression contains at most one side effect, as its outermost operation, and when code does not depend on exactly which exception arises as a consequence of the left-to-right evaluation of expressions.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.