为什么打印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);
}
}
我们可以混合使用Cast和+,-
一元运算符吗?我知道我们可以多次进行投射,但为什么不将+ ,-
一元运算符置于其间会产生错误?
答案 0 :(得分:80)
您不是在添加也不是在减少。那些+和 - 运算符是一元符号运算符。
请参阅 The Unary Operators 部分的documentation。
利害攸关的序列:
(byte)+(short)-(int)+(long)-1
从右到左进行评估:
初始值为-1
铸造到长(仍然是-1)
一元+符号(仍为-1)
铸造到int(仍为-1)
一元 - 符号(现在值为1)
等等(值保持1直到结束)
答案 1 :(得分:39)
这些+
和-
是一元的。
更具体地说,它实际上是:
System.out.println((byte) (+((short) (-((int) (+((long) -1)))))));
答案 2 :(得分:12)
如果从示例中删除所有强制转换,因为在这种情况下它将不执行任何操作
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
答案 3 :(得分:7)
我知道我们可以多次进行投射。但是在它们之间加上+, - 一元运算符不会出错?
这只是Java语法一致性的结果。当你写
+ 1
你实际写的是一元数字表达式,它分解为两部分:
+
int
文字1
。数字表达式的另一个例子是强制转换表达式(也是一元):
(int) 1
因此,您可以将其替换为上面的原始1
:
+ (int) 1
重复相同的一致过程,我们最终会得到一个任意复杂度的嵌套一元表达式。要回到您的关键问题:
为什么?
因为Java实际上需要一个特定的规则来反对这样的表达式。