Java编译器通过`(字节)+;(char)-(int)和#x2B;(长)-1`?

Java编译器通过`(字节)+;(char)-(int)和#x2B;(长)-1`?,java,Java,可能重复: 为什么这段代码在Java中 int i = (byte) + (char) - (int) + (long) - 1; System.out.println(i); 打印1?为什么它还要编译 来源:各种()零件只是在各种类型之间铸造。因此,从右边读取,1->-1->(long)-1->(int)-1->-(int)-1=1->-(char)1)-(byte)1,然后在赋值过程中转换为int。类型转换在任何时候都不会导致值的有效更改,因此整个第一行相当于inti=1从右向左-1投长

可能重复:

为什么这段代码在Java中

int i = (byte) + (char) - (int) + (long) - 1;
System.out.println(i);
打印1?为什么它还要编译


来源:

各种
()
零件只是在各种类型之间铸造。因此,从右边读取,
1
->
-1
->
(long)-1
->
(int)-1
->
-(int)-1=1
->
-(char)1)
-(byte)1
,然后在赋值过程中转换为
int
。类型转换在任何时候都不会导致值的有效更改,因此整个第一行相当于
inti=1

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

您要做的是将类型强制转换与一元运算符相结合

让我们看看:

首先,您有一个值
-1
,您将该值转换为类型
long

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

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

然后您将其转换为char,因此我们有
char1
。然后,使用一元运算符
+
,因此仍然有
1

最后,该值被转换为
字节
,因此您有
字节1
。然后它再次(隐式)转换为
int

让我们添加括号:

int i = ((byte) + ((char) - ((int) + ((long) (- 1)))));
System.out.println(i);
基本上,这只是一系列强制转换和一元运算符(
+
不执行任何操作,
-
否定)

完整的程序流程位于的答案中

源对源