[英]Multiple typecasting in a single line in Java program
在今天乱搞Java语法的同时,我尝试编译以下java代码:
class Mess {
public static void main(String[] args) {
float i = (char)(int)(long)(byte) 100;
System.out.println(i);
}
}
代码实际上没有给出编译或运行时错误。 将i
数据类型更改为任何其他数据类型(如int
或double
或char
也有效。 不仅如此,在声明中引入操作也没有任何错误:
float i = (char)+(int)-(long)(byte) 100;
当我在Netbeans中使用自动格式来格式化代码时,上面的声明格式如下:
float i = (char) +(int) -(long) (byte) 100;
请帮助我理解这段代码是如何编译的?
它基本上只是一系列演员和一元+
和-
。
float i = (char) +(int) -(long) (byte) 100;
它相当于
byte tmp1 = (byte) 100;
long tmp2 = (long) tmp1;
long tmp3 = -tmp2;
int tmp4 = (int) tmp3;
int tmp5 = +tmp4;
char tmp6 = tmp5;
float i = tmp6;
最后的赋值是从char
到float
,这是一个扩展的原始转换。 请参阅JLS第5章:转换和促销
对原始类型的19个特定转换称为扩展原始转换:
- byte to short,int,long,float或double
- 短,int,long,float或double
- char到int,long, float或double
- int到long,float或double
- 长期浮动或加倍
- 漂浮加倍
考虑一下这样:
float i = ((char) +((int) -((long) ((byte) 100))));
每个步骤都会将结果转换为自己的类型。 所以,令人惊讶的是100因为所有这些中间类型演员而变成了65436.0。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.