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的回答中