为什么混合+和强制转换不会在"+(int)+(long)-1"产生错误?

  • 本文关键字:int long 错误 混合 转换 java
  • 更新时间 :
  • 英文 :


为什么要打印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

您实际编写的是一个一元数字表达式,它分解为两部分:

  1. 一元加运算符:+
  2. 数值表达式,在本例中为int文字1

数值表达式的另一个例子是强制转换表达式(也是一元表达式):

(int) 1

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

+ (int) 1

重复相同的一致性过程,我们最终会得到任意复杂度的嵌套一元表达式。返回您的关键问题:

为什么?

因为Java实际上需要一个针对这样的表达式的特定规则

最新更新