这些声明有哪些不同之处?
发布于 2009-09-18 09:25:27
在尝试了一个简单的程序(使用0和100来显示“特殊”常量与一般常量之间的区别)之后,Sun Java 6编译器将为1和2输出相同的字节码(就编译器而言,情况3和4与2相同)。
举个例子:
double x = 100;
double y = 100.0;编译为:
0: ldc2_w #2; //double 100.0d
3: dstore_1
4: ldc2_w #2; //double 100.0d
7: dstore_3但是,我在Java语言规范中看不到任何保证常量表达式的编译时扩展的东西。对于像这样的情况,会有编译时间的限制:
byte b = 100;正如section 5.2中所指定的,但这并不完全是一回事。
也许比我眼尖的人能在某处找到一个保证...
发布于 2009-09-18 10:36:47
对于第一个问题:
double dummy = 0;整数文字0通过扩大原语转换转换为双精度型,请参阅Java中的5.1.2 Widening Primitive Conversion。请注意,这完全是由编译器完成的,它对生成的字节码没有任何影响。
对于其他人:
double dummy = 0.0;
double dummy = 0.0d;
double dummy = 0.0D;这三个是完全相同的- 0.0、0.0d和0.0D只是编写double文本的三种不同方式。请参阅JLS中的3.10.2 Floating-Point Literals。
发布于 2009-09-18 08:59:12
最后3个应该是相同的。右边的文字已经是双精度的了。'd‘或'D’是隐式的,当你有一个十进制的文字。
第一个略有不同,因为0是一个整型文字,它将被扩大为双精度型。我不知道在这种情况下是否会产生不同的字节代码;结果应该是相同的。
https://stackoverflow.com/questions/1443331
复制相似问题