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。
已编辑
计算表达式的步骤如下:
- 从左到右计算所有具有increment/decrement的表达式
- 用真实值替换所有变量
- 使用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)。
这就是乘法发生在递增之前的原因。结合性决定了这里先发生什么,而不是优先级。
我明白这个操作的区别(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。
已编辑
计算表达式的步骤如下:
- 从左到右计算所有具有increment/decrement的表达式
- 用真实值替换所有变量
- 使用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)。
这就是乘法发生在递增之前的原因。结合性决定了这里先发生什么,而不是优先级。