Java编译器通过`(byte)+(char) - (int)+(long) - 1`解释什么?

时间:2012-03-11 01:52:48

标签: java

  

可能重复:
  Weird java behavior with casts to primitive types

为什么这段代码用Java编写,

int i = (byte) + (char) - (int) + (long) - 1;
System.out.println(i);

打印1?为什么甚至编译?

来源:Java Code Geeks

4 个答案:

答案 0 :(得分:16)

您正在做的是将类型转换与一元运算符组合在一起。

所以让我们看看:

首先,您拥有值-1,并将其转换为long类型。

然后,您执行一元操作+,该操作不会更改值,因此您仍然拥有(long) -1

然后,你将它转换为int,所以我们现在有int -1。然后,您使用一元运算符-,因此我们-(-1)1

然后你把它投射到char,所以我们有char 1。然后,您使用一元运算符+,因此您仍然拥有1

最后,该值会转换为byte,因此您拥有byte 1。然后再次(隐式)强制转换为int

答案 1 :(得分:5)

各种(<type>)部分只是在不同类型之间进行投射。所以会发生什么,从右边开始,1 - &gt; -1 - &gt; (long)-1 - &gt; (int)-1 - &gt; -(int)-1 = 1 - &gt; (char)1) - &gt; (byte)1然后在分配期间转换为int。类型转换不会导致值的有效更改,因此整个第一行等同于int i = 1;

答案 2 :(得分:2)

这是从右到左。 -1被转换为长。然后应用+前缀(没有效果),并将其强制转换为int。然后 - 应用(将其更改为1)并将其转换为char。最后,应用+前缀(仍然没有效果)并将其转换为字节。

答案 3 :(得分:0)

让我们添加括号:

int i = ((byte) + ((char) - ((int) + ((long) (- 1)))));
System.out.println(i);

基本上这只是一系列强制转换和一元运算符(+什么都不做,-否定)

完整的程序流程在luiscubal的回答中