为什么mix +和cast不会在“+(int)+(long)-1”中产生错误?
为什么打印1?
import java.util.*; import java.lang.*; import java.io.*; class Main { public static void main (String[] args) throws java.lang.Exception { // your code goes here System.out.println((byte)+(short)-(int)+(long)-1); } }
我们可以混合铸造和+,-
一元操作员? 我知道我们可以多次投射,但是为什么不把+ ,-
一元运算符放在中间产生一个错误呢?
你不加,也不减。 那些+和 – 运算符是一元符号运算符。
请参阅The Unary Operators部分的文档 。
关键的顺序是:
(byte)+(short)-(int)+(long)-1
从右到左评估如下:
初始值是-1
铸造到长(仍然是-1)
一元+符号(仍然-1)
铸造成int(仍然-1)
一元 – 符号(现在的值是1)
如此(直到结束,值仍然是1)
这些+
和-
是一元的。
更具体地说,事实上:
System.out.println((byte) (+((short) (-((int) (+((long) -1)))))));
如果你从你的例子中删除所有的铸造,因为在这种情况下,它不会做任何事情
System.out.println((byte)+(short)-(int)+(long)-1);
会变成
System.out.println( + - + -1);
现在你可以看到,只有运营商仍然在那里,因为减去和减去加上你的结果将是1
基本上你可以这样想:
var mylong = +(long)-1; <- -1 var myint = -(int)mylong; <- 1 var myshort = +(short)myint; <- 1 var mybyte = (byte)myshort; <- 1
我知道我们可以铸造多次。 但是把+, – 一元运算符放在中间不会给出错误?
这只是Java语法一致性的结果。 当你写
+ 1
你实际上写的是一个一元数字expression式 ,分解成两部分:
- 一元加运算符:
+
- 一个数字expression式 ,在这个例子中是
int
数字1
。
数值expression式的另一个例子是一个强制expression式 (也是一元):
(int) 1
因此,您可以将其replace为上面的原始1
:
+ (int) 1
重复相同的一致过程,我们可以最终得到一个任意复杂的嵌套一元expression式。 回到你的关键问题:
为什么?
因为Java实际上需要针对这种expression式的特定规则。