在Java中混淆​​类型转换

时间:2011-11-09 03:41:59

标签: java casting

  

可能重复:
  Weird java behavior with casts to primitive types

让我们看一下Java中的以下代码片段。

package typecasting;

final public class TypeCasting
{
    public static void main(String[] args)
    {
        int i = (byte) + (char) - (int) + (long) - 1;
        System.out.print("\n i = "+i+"\n");
    }
}

声明System.out.print("\n i = "+i+"\n");显示 i = 1 。怎么样?

4 个答案:

答案 0 :(得分:7)

此代码使用一元+-运算符。

它等同于-(-1)并带有一堆额外的强制转换。 (unary + operator不会更改值)

答案 1 :(得分:4)

该行:

(byte) + (char) - (int) + (long) - 1;

被解析为:

(byte) (+(char) (-(int) (+(long)(-1) ) ) );

所有+-都是一元运算符。由于有两个-1被否定两次,因此整个表达式的计算结果为1

答案 2 :(得分:3)

运营商被视为一元 +和一元 - 。

int i = (byte) (+ (char) (- (int) (+ (long) (- 1))));

答案 3 :(得分:2)

JLS指定以下内容:

 CastExpression:
    ( PrimitiveType Dimsopt ) UnaryExpression
    ( ReferenceType ) UnaryExpressionNotPlusMinus

这意味着任何表达式(原始类型)后面都是一个UnaryExpression。如果我接受你的陈述并将[]放在一元表达式周围:

(byte) 
  [+(char) 
    [-(int) 
      [+(long) 
        [-1]
      ]
    ]
  ];