【发布时间】:2020-06-23 07:28:59
【问题描述】:
我有问题逐步java表达式计算
System.out.println(++x + x++ * y-- - --y);
我知道这个优先级: 1. 后缀一元 2.前缀一元 3. 乘法 4.添加剂
但是当我用这个优先级计算时,结果如下: // 12 + 11 * 19 - 18 谁能帮帮我
【问题讨论】:
标签: java expression operator-keyword operator-precedence
我有问题逐步java表达式计算
System.out.println(++x + x++ * y-- - --y);
我知道这个优先级: 1. 后缀一元 2.前缀一元 3. 乘法 4.添加剂
但是当我用这个优先级计算时,结果如下: // 12 + 11 * 19 - 18 谁能帮帮我
【问题讨论】:
标签: java expression operator-keyword operator-precedence
你可以从下面给出的例子中理解它:
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
}
}
计算步骤:
++x = 66 + x++ * y-- = 6 + 6 * 10 = 6 + 60 = 66(之后y会因为y--而变成9,x会因为x++而变成7,但是x的这个增加值从未用于后续计算)
66 - 8 = 58(在y被66减去之前,它将变成8,因为--y)【讨论】:
后缀一元在变量评估之后应用,与前缀相反,在评估之前应用,您的表达式可以重写:
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
【讨论】: