我最近开始在计算机科学课上学习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?
答案 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
,即使发生下溢。
对于任何整数类型都是如此:byte
,short
,int
和long
。
有趣的是,大多数常见浮点值也是如此,例如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(一元) - ,减法(加法)和赋值。这使您的声明按此顺序运行:
x = 5 - (--x)
:x(5)在此操作后递减x = 5 - (3)
:x再次从之前递减的值减少到3 x = 5 - 3
x = 2