我了解此操作之间的区别(后递增,前递增)。 但是问题:我有一个表达:
long y = x * 4 - x++;
1). x++ => return 4 (save x = 5)
2). final expression: 5 * 4 - 4 = 16
具有最高优先级的一元运算符,而不是“ *”和最后一个“-”。我认为它将是:
12
但是当我在IDE中进行编译时,答案是{{1}}!有什么问题,我在哪里做了。错误?
答案 0 :(得分:3)
已编辑
以下是计算表达式的步骤:
示例:
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
->由于它是预减量,因此我们首先将x
减量代替,因此x
将为3
5 * 5 / 5 + 3
//这将是新的方程式
由于方程式中没有变量,我们现在将使用PEMDAS评估表达式
25 / 5 + 3
5 + 3
8
因此结果将是8
答案 1 :(得分:2)
long y = 4 * 4 - 4;
x将在分配后递增
每次x都被x ++“调用”时,x之后会递增 例如
int x = 1;
System.out.println(x++ + x++ * x++ + x++);
// 1 + 2 * 3 + 4
答案 2 :(得分:1)
x的计算结果为4,x ++的计算结果也为4,然后递增为5。 因此本质上是4 * 4-4,这得到了预期的12。
答案 3 :(得分:1)
乘法是单独解决的,所以x == 4
。增量随后发生,因此实际上是4 * 4 - 4 == 12
,并且在此操作x == 5
之后。
答案 4 :(得分:1)
减法的左侧总是在右侧之前计算,因为减法是左关联的,即5-2-1是(5-2)-1,而不是5-(2-1)。
这就是为什么乘法发生在增量之前。关联性决定首先发生什么,而不是优先发生。