为什么这段代码用Java编写,
int i = (byte) + (char) - (int) + (long) - 1;
System.out.println(i);
打印1?为什么甚至编译?
答案 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的回答中