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);
基本上,这只是一系列强制转换和一元运算符(+
不执行任何操作,-
否定)
完整的程序流程位于的答案中源对源