java вычисление выражения и приоритет оператора - PullRequest
2 голосов
/ 11 марта 2020

у меня есть проблема, чтобы шаг за шагом java вычисление выражения

System.out.println(++x + x++ * y-- - --y);

Я знаю этот приоритет: 1. постфиксный унарный 2. префиксный унарный 3. мультипликативный 4. аддитивный

но когда я вычисляю с этим приоритетом, результат будет ниже: // 12 + 11 * 19 - 18 может кто-нибудь мне помочь

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Вы можете понять это из приведенного ниже примера:

public class Main {
    public static void main(String[] args) {
        int x = 5, y = 10;
        System.out.println(++x + x++ * y-- - --y);// 6 + 6 * 10 - 8 = 58
    }
}

Шаги в этом расчете:

  1. ++x = 6
  2. 6 + x++ * y-- = 6 + 6 * 10 = 6 + 60 = 66 (после y станет 9 из-за y--, а x станет 7 из-за x++, но это увеличенное значение x никогда не использовалось в последующих вычислениях)
  3. 66 - 8 = 58 (прежде чем y будет вычтено из 66, оно станет 8 из-за --y)
0 голосов
/ 11 марта 2020

Постфиксный унарный применяется после оценки переменной, в отличие от префикса, который применяется перед оценкой, ваше выражение может быть переписано:

int x_prefix = x + 1; // ++x
int y_prefix = y - 1; // --y

System.out.println(x_prefix + x * y - y_prefix);

int x = x + 1; // x++
int y = y - 1; // y--

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

ПРИМЕЧАНИЕ: Я просто переписал ваше выражение как если в том же выражении вы используете переменный постфикс, то при следующем доступе переменная увеличивается:

int x = 1;

System.out.println(x++ + x++); // 1 + 2
System.out.println(x) // 3

Для полноты:

int x = 1;

System.out.println(++x + ++x); // 2 + 3
System.out.println(x) // 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...