Java编译器通过`(byte)+(char) – (int)+(long) – 1`解释什么?
可能重复:
使用强制转换为基本类型的奇怪java行为
为什么这段代码用Java编写,
int i = (byte) + (char) - (int) + (long) - 1; System.out.println(i);
打印1? 为什么甚至编译?
资料来源: Java Code Geeks
你正在做的是将类型转换与一元运算符组合在一起。
所以让我们看看:
首先,您具有值-1
,您将其转换为long
类型。
然后,执行一元操作+
,它不会改变值,所以你仍然有(long) -1
。
然后,将它转换为int,所以我们现在有int -1
。 然后,你使用一元运算符-
所以我们有-(-1)
,它是1
。
然后你把它转换为char,所以我们有char 1
。 然后,你使用一元运算符+
,所以你仍然有1
。
最后,该值被转换为byte
,因此您有byte 1
。 然后再次(隐式)转换为int
。
各种(
部件只是在各种类型之间进行铸造。 所以会发生什么,从右边读取, 1
– > -1
– > (long)-1
– > (int)-1
– > -(int)-1 = 1
– > (char)1)
– > (byte)1
然后在赋值期间被转换为int
。 类型转换在任何时候都不会导致值的有效更改,因此整个第一行等效于int i = 1;
。
这是从右到左。 -1被转换为长。 然后应用+前缀(没有效果),并将其强制转换为int。 然后 – 应用(将其更改为1)并将其转换为char。 最后,应用+前缀(仍然没有效果)并将其转换为字节。
让我们添加括号:
int i = ((byte) + ((char) - ((int) + ((long) (- 1))))); System.out.println(i);
基本上这只是一系列演员和一元运算符( +
什么都不做, -
否定)
整个程序流程都在luiscubal的回答中