Приоритет оператора компоновки Java в выражениях

Вывод следующего кода объявляется как "6", когда я пытаюсь выполнить это.

Когда я пытаюсь обдумать это, выражение "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 ответа

Решение

Посмотрите на поведение в JLS - Оператор сложного присваивания. Я приведу здесь два соответствующих абзаца, просто для полноты ответа:

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

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

Акцент мой.

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

Официальные документы по операторам говорят

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

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

Теперь вы правильно поняли свой ответ??

Другие вопросы по тегам