post-增量,预增量。 JAVA

post-increment, pre-increment. JAVA

我明白这个操作的区别(post-increment,pre-increment)。 但是问题:我有一个表达式:

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

优先级最高的是 post- 一元运算符,而不是“*”和最后一个“-”。在我看来它将是:

long y = x * 4 - x++;

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

但是当我在 IDE 中编译时,答案是 12!有什么问题,我在哪里做了 smth。错误的?

long y = 4 * 4 - 4;

x 将在这次赋值后递增

每次 x 是 "called" 时 x++ 它在之后递增 例如

    int x = 1;
    System.out.println(x++ + x++ * x++ + x++);
    // 1 + 2 * 3 + 4

x 的计算结果为 4,x++ 的计算结果也为 4,然后递增为 5。 所以它本质上是 4 * 4 - 4 ,按预期给出 12。

已编辑

计算表达式的步骤如下:

  1. 从左到右计算所有具有increment/decrement的表达式
  2. 用真实值替换所有变量
  3. 使用PEMDAS规则计算表达式

示例:

int x = 4;   
int y = ++x * 5 / x-- + --x;  
  • 首先我们需要在计算表达式之前替换 x 的所有值(从左到右替换)
    ++x -> 因为它是一个 post 增量,我们将在替换之前首先增加 x,因此 x 将是 5
    5 * 5 / x-- + --x -> 这将是新方程
    现在我们将 x 替换为 x--
    x-- -> 因为它是一个 post 减量 x 这里将被替换为 5 并且在替换后减量 x,因此 x 将是 4
    5 * 5 / 5 + --x -> 这将是新的等式
    现在我们将 x 替换为 --x
    --x -> 因为它是预递减我们将首先递减 x 替代,因此 x 将是 3
    5 * 5 / 5 + 3 // 这将是新方程

  • 由于方程中没有变量,我们现在将使用 PEMDAS
    计算表达式 25 / 5 + 3 5 + 3
    8
    因此结果将是 8

乘法单独求解,所以x == 4。增量发生在之后,所以它实际上是 4 * 4 - 4 == 12 并且在这个操作之后 x == 5.

减法的左侧总是在右侧计算之前计算,因为减法是左结合的,即 5 - 2 - 1 是 (5 - 2) - 1,而不是 5 - (2 - 1)。

这就是乘法发生在递增之前的原因。结合性决定了这里先发生什么,而不是优先级。