为什么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式 ,分解成两部分:

  1. 一元加运算符: +
  2. 一个数字expression式 ,在这个例子中是int 数字 1

数值expression式的另一个例子是一个强制expression式 (也是一元):

 (int) 1 

因此,您可以将其replace为上面的原始1

 + (int) 1 

重复相同的一致过程,我们可以最终得到一个任意复杂的嵌套一元expression式。 回到你的关键问题:

为什么?

因为Java实际上需要针对这种expression式的特定规则。