2013-08-03 2 views
1

Результат следующего кода объявляется как «6» при попытке выполнить это.Назначение Java Compound Assignment в выражениях

Когда я пытаюсь это понять, выражение «k + = 3 + ++ k; должно быть оценено как k = k + (3 + ++ k), но в этом случае выход должен иметь 7. Похоже, что он был оценен как k = k + 3 + ++ k, в результате чего было получено 6.

Не могли бы вы объяснить, почему выражение было оценено как «k + 3 + ++ k» вместо "k + (3 + ++ k); ?

public class TestClass { 

public static int m1(int i){ 
    return ++i; 
} 

public static void main(String[] args) { 

    int k = m1(args.length); 
    k += 3 + ++k; 
    System.out.println(k); 
} 

}

+2

Все это определено в [раздел 15.7 Спецификации языка Java] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.7). Соответствующий раздел довольно утомительно читать (и, следовательно, утомительно объяснять здесь), но это нормально, потому что на практике никогда не нужно писать такой код;) –

+0

@OliCharlesworth - Спасибо, что поделились спецификациями. После прохождения примера «Пример 15.26.2-2. Значение левой стороны составного присвоения сохраняется до оценки правой стороны» на странице «Технические характеристики» я могу понять, как оценивалось выражение. – sunsin1985

ответ

4

Посмотрите на поведение в JLS - Compound Assignment Operator. Я процитирую соответствующие два пункта здесь, только для полноты ответа:

В противном случае значения левого операнда сохраняется, а затем правый операнд вычисляется. Если эта оценка завершается внезапно, то выражение присваивания внезапно завершается по той же причине и не происходит никакого присваивания.

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

Emphasis mine.

Итак, сначала обрабатывается левый операнд, и он выполняется только один раз. И тогда оцениваемое значение левого операнда 1 в вашем случае добавляется с результатом правого операнда, который оказывается 5. Отсюда результат 6.

+0

- Спасибо за ваш ответ. Я прочитал следующий пример по ссылке, которую вы используете. Теперь это имеет для меня полный смысл.Значение переменной «K» оценивалось как «1» (как вы также указали в своем ответе). После этого правый операнд был оценен до 5 и после этого прибавил к значению K. Благодаря! Пример в JLS: «Пример 15.26.2-2. Значение левой стороны составного назначения сохраняется до оценки правой стороны» – sunsin1985

+0

@ sunsin1985. Пожалуйста :) –

0

Official Docs on Operators says

Все бинарные операторы для операторов присваивания, кроме вычисляются слева направо; операторы присваивания оцениваются справа налево.

Так + оценивается left-to-right, где, как операторы присваивания оцененных right to left.

Теперь вы получили ваш правильный ответ ??

+1

оператор присваивания! = Оператор присваивания. –