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

时间:2015-02-18 11:39:13

标签: 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);
    }
}

我们可以混合使用Cast和+,-一元运算符吗?我知道我们可以多次进行投射,但为什么不将+ ,-一元运算符置于其间会产生错误?

4 个答案:

答案 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

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

  1. 一元加运算符:+
  2. 数字表达式,在本例中为int文字1
  3. 数字表达式的另一个例子是强制转换表达式(也是一元):

    (int) 1
    

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

    + (int) 1
    

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

      

    为什么?

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