Следующий фрагмент не дает ожидаемого результата

Я нашел это в одном из вопросов викторины по программированию на 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));
  1. оценивать i++, оставь левый операнд 0и приращение i в 1,

  2. проходить i(1) в c.operation(i)выполнить System.out.print(i++), Распечатать1 затем вернитесь 2(правый операнд).

  3. i++ + c.operation(i) ---> 0 + 2, печать2,

  4. Распечатать1,

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