我最近开始在计算机科学课上学习 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/