为什么要打印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);
}
}
我们可以混合投射和+,-
一元运算符吗?我知道我们可以多次进行强制转换,但为什么把+ ,-
一元运算符放在中间不产生错误呢?
您既没有添加也没有减少。那些+和-运算符是一元符号运算符。
请参阅一元运算符部分的文档。
关键序列:
(byte)+(short)-(int)+(long)-1
从右到左评估如下:
初始值为-1
铸造为长(仍然是-1)
一元+符号(静态-1)
强制转换为int(still-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
您实际编写的是一个一元数字表达式,它分解为两部分:
- 一元加运算符:
+
- 数值表达式,在本例中为
int
文字1
数值表达式的另一个例子是强制转换表达式(也是一元表达式):
(int) 1
因此,您可以将其替换为上面的原始1
:
+ (int) 1
重复相同的一致性过程,我们最终会得到任意复杂度的嵌套一元表达式。返回您的关键问题:
为什么?
因为Java实际上需要一个针对这样的表达式的特定规则。