Приоритет оператора компоновки 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.
Теперь вы правильно поняли свой ответ??