Как я получил этот ответ? - PullRequest
0 голосов
/ 19 ноября 2018

У меня следующий код Java:

public class myClass {

    public static void main(String[] args) {

        System.out.println("Hello World!");

        int x = 20;
        int y = 10;

        double z = x++ - y * 7 / --y + x * 10;
        System.out.println(z);
    }
}

Я получил 223.0 вывода. Но я хотел бы знать пошаговый процесс. Кто-то, пожалуйста, объясните это в соответствии с приоритетом оператора.

1 Ответ

0 голосов
/ 19 ноября 2018

Я решил написать ответ, потому что там есть gotcha , который не связан с приоритетом оператора (см. Шаг 3).

Шаг 0: Входное выражение -

   x++ - y * 7 / --y + x * 10;

Шаг 1: С точки зрения приоритета оператора, приращение / уменьшение имеют более высокий приоритет, чем умножение / деление, а умножение / деление имеет более высокий приоритет, чем сложение / вычитание, поэтому добавьте несколько скобок, чтобы уточнить, что -

   (x++) - (y * 7 / (--y)) + (x * 10);

Шаг 2: Следующее, что нужно сделать, это заменить переменные значениями с учетом того, как работают операторы до / после увеличения / уменьшения -

   20 - (10 * 7 / 9) + (21 * 10)
//  ^             ^      ^
//  |           Pre-1    |
//  |                    |
//  + -----------------Post+1

Шаг 3: Единственное, что не связано с приоритетом оператора: выполнение операции над целочисленными операндами дает целочисленный результат, даже если результат выражения присваивается типу с плавающей запятой. Следовательно, 10 * 7 / 9 дает 7 -

   20 - (7) + (210)

Шаг 4: Выражения вычисляются слева направо -

   20 - 7 + 210
   13 + 210
   223

Шаг 5: Целочисленный результат присваивается double -

   223.0
...