关于前后减量结果的混淆

时间:2015-02-06 19:18:28

标签: java

我最近开始在计算机科学课上学习java,而且我遇到了一些有趣的东西。 基本上我将我的变量设置如下 int x = 5;

我创建了一个表达式x = (x--) - (--x) 当我打印变量x时,无论变量2是什么,它总是以x结果。

确切的代码是:

import acm.program.*;

public class MathOperations extends ConsoleProgram {

    private static final long serialVersionUID = 1L;

    public void run(){

        setFont("arial-bold-24");

        int x = -5, y = -3;
        double z = 2.2;

        x = (x--) - (--x);

        println ("x= " + x);
    }

}

为什么结果总是2?

2 个答案:

答案 0 :(得分:4)

对于您可以使用的任何2,结果始终为int。原因是:

首先评估

(x--),因为操作数从左到右进行评估。这会产生原始值x,但之后,x是原始x - 1.然后评估(--x)。它返回x - 1,已经递减一次,因此结果为原始x - 2。

从那里开始,这是简单的数学运算,x - (x - 2)2

但是减量可能会下降呢?

int x = Integer.MIN_VALUE + 1;
x = x-- - --x;
System.out.println(x);

结果仍为2。怎么样? Integer.MIN_VALUE是:

10000000 00000000 00000000 00000000

减少两次将产生Integer.MAX_VALUE - 1

01111111 11111111 11111111 11111110

以2的补码表示法减法产生

00000000 00000000 00000000 00000010

2,即使发生下溢。

对于任何整数类型都是如此:byteshortintlong

有趣的是,大多数常见浮点值也是如此,例如2.2

但是,如果浮点类型的精度大于1,则递减操作的结果将更改该值。在这种情况下,结果将是0

double x = (double) (1L << 54);
x = x-- - --x;
System.out.println(x);

结果:

0.0

答案 1 :(得分:0)

Java使用固定的order of precedence评估运算符。这行代码x = (x--) - (--x)有4个运算符:Prefix--,postfix--,subtraction,assignment。按优先顺序排序,它们是postfix--,prexfix(一元) - ,减法(加法)和赋值。这使您的声明按此顺序运行:

  1. x = 5 - (--x):x(5)在此操作后递减
  2. x = 5 - (3):x再次从之前递减的值减少到3
  3. x = 5 - 3
  4. x = 2