Следующий фрагмент не дает ожидаемого результата
Я нашел это в одном из вопросов викторины по программированию на Java.
public class Calculator {
public static void main(String[] args) {
int i = 0;
Calculator c = new Calculator();
System.out.print(i++ + c.opearation(i));
System.out.print(i);
}
public int operation(int i) {
System.out.print(i++);
return i;
}
}
Выполнение приведенного выше фрагмента дает мне результат 121
, Я ожидаю, что это будет 111
, Я объясню, как я это интерпретировал.
+
Оператор сложения будет выполняться справа налево (ref: приоритет оператора). Так, c.operation(0)
вызывается первым и печатает значение 1
вместо этого я ожидаю, что значение будет 0
поскольку System.out.print
печатает значение i
сначала, а затем увеличивает значение i, так как это оператор постинкрементного.
Во-вторых, i
значение 1 возвращается в основной и оператор System.out.print(i++ + 1)
исполняется сейчас. И с тех пор i
имеет оператор приращения, который он должен был выполнить как 0 + 1
и дал результат 1
распечатал результат как 2
,
В-третьих, i
значение теперь увеличивается до 1
и это будет напечатано, как и ожидалось.
Короче говоря, я ожидаю, что значение будет напечатано как 011
но я получил результат как 121
, Я не уверен, где моя интерпретация идет не так.
1 ответ
Аддитивные операторы имеют одинаковый приоритет и синтаксически левоассоциативны (они группируются слева направо).
int i = 0;
System.out.print(i++ + c.operation(i));
оценивать
i++
, оставь левый операнд0
и приращениеi
в1
,проходить
i(1)
вc.operation(i)
выполнитьSystem.out.print(i++)
, Распечатать1
затем вернитесь2
(правый операнд).i++ + c.operation(i) ---> 0 + 2
, печать2
,Распечатать
1
,