java - 混淆前后递减的结果

标签 java

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

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

具体代码是:

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 , 对于任何 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 ,即使发生下溢。

对于任何整数类型都是如此:byte , short , int , 和 long .

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

但是,如果浮点型的精度大于1 ,则减量操作的结果不会改变值。在这种情况下,结果将为 0 .

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

结果:

0.0

关于java - 混淆前后递减的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28373144/

相关文章:

java - Sendgrid 中的 NoClassDefFoundError

java - ImageView 留有大量可用空间

java - Swing - 如何模仿为什么我的外观会绘制禁用图标?

java - 在未指定 Xmx 的情况下尝试分配超过 128M Xms 时出现 JVM 错误

java.util.SimpleTimezone 什么是 startMode 和 endMode?

java - 使用蓝牙服务时如何避免出现 "Are you missing a call to unregisterReceiver()?"错误?

java - 使用 JAX-RS 使用 JSON

java - Spring + hibernate + JPA

java - 将父版本外部化为 POM 中的变量

java - 将时间戳字符串 "HH:mm:ss"转换为持续时间