постинкремент, преинкремент. ДЖАВА - PullRequest
1 голос
/ 15 марта 2019

Я понимаю разницу между этими операциями (постинкремент, преинкремент).Но вопрос: у меня есть выражение:

int x = 4;
long y = x * 4 - x++;

Наивысший приоритет имеет пост-унарный оператор, чем "*" и последний "-".По моему мнению, это будет:

long y = x * 4 - x++;

1). x++ => return 4 (save x = 5)
2). final expression: 5 * 4 - 4 = 16

Но когда я скомпилирую это в IDE, ответ будет 12!В чем проблема и где я что-то сделал?неправильно?

Ответы [ 5 ]

3 голосов
/ 15 марта 2019

РЕДАКТИРОВАНИЕ

Вот шаги для оценки выражения:

  1. Оценить все выражения, которые имеют увеличение / уменьшение отслева направо
  2. Заменить все переменные их истинным значением
  3. Оценить выражение, используя PEMDAS rule

Пример:

int x = 4;   
int y = ++x * 5 / x-- + --x;  
  • сначала нам нужно подставить все значения x перед вычислением выражения (подставить слева направо)
    ++x ->, так как это постинкремент, мы сначала увеличимx перед заменой, таким образом x будет 5
    5 * 5 / x-- + --x -> это будет новое уравнение
    , теперь мы подставим x в x--
    x-- ->, так какэто пост-декремент x здесь будет заменен на 5 и после декремента подстановки x, таким образом x будет 4
    5 * 5 / 5 + --x -> это будет новое уравнение
    теперь мы будемподставьте x в --x
    --x -> так как это предварительный декремент, мы сначалаcrement x подставляя, таким образом x будет 3
    5 * 5 / 5 + 3 // это будет новое уравнение

  • Поскольку в уравнении нет переменных, мы теперьоцените выражение, используя PEMDAS
    25 / 5 + 3 5 + 3
    8
    , таким образом, результат будет 8

3 голосов
/ 15 марта 2019
long y = 4 * 4 - 4;

x будет увеличен после этого присваивания

Каждый раз, когда x "вызывается" с x ++, он увеличивается после Eg

    int x = 1;
    System.out.println(x++ + x++ * x++ + x++);
    // 1 + 2 * 3 + 4
2 голосов
/ 15 марта 2019

Умножение разрешается отдельно, поэтому x == 4. После этого происходит увеличение, поэтому на самом деле это 4 * 4 - 4 == 12, а после этой операции x == 5.

2 голосов
/ 15 марта 2019

x оценивается как 4, а x ++ также оценивается как 4, а затем увеличивается до 5. Таким образом, по сути это 4 * 4 - 4, что дает 12, как и ожидалось.

1 голос
/ 15 марта 2019

Левая сторона вычитания всегда вычисляется перед правой стороной, потому что вычитание является ассоциативным слева, т. Е. 5 - 2 - 1 - это (5-2) - 1, а не 5 - (2 - 1).

Вот почему умножение происходит до приращения. Ассоциативность определяет, что здесь происходит в первую очередь, а не приоритет.

...