以何种方式是这些语句有什么不同?
- 双虚设= 0;
- 双虚设= 0.0;
- 双虚设= 0.0D;
- 双虚设= 0.0D;
以何种方式是这些语句有什么不同?
尝试过一个简单的程序(同时使用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;
如在规定的第5.2节 ,但是这并不完全是一回事。
也许有人比我更锐利的眼睛能找到一个保证那里的某个地方......
对于第一种:
double dummy = 0;
字面整数0
被转换为一个双带加宽原语转换,请参见5.1.2加宽原语转换在Java语言规范。 请注意,这是由编译器完全完成,它并没有对所产生的字节码的任何影响。
对于其他的人:
double dummy = 0.0;
double dummy = 0.0d;
double dummy = 0.0D;
这三个是完全一样的- 0.0
, 0.0d
和0.0D
只有三个写一个不同的方式double
文字。 见3.10.2浮点文本在JLS。
最后3应该是相同的。 在右侧的文字已经是一个双。 在“D”或“d”是隐含的,当你有一个十进制文本。
第一个是稍有不同在于0是一个int的文本,这将被扩大至两倍。 我不知道,即使产生在这种情况下还是不不同的字节码; 结果应该是相同的反正。
为Java我并不确切地知道,在C这可能是非常危险的,如果你在最后省略此d,因为它不会改变高位字节,它可以在您的变量在于,你居然没有把在数量上的效果!
在Java中我有一个非常大的问题,instatntiating BigDecimal的 - 新的BigDecimal(0)和新的BigDecimal(0L)是不一样的东西,你能感觉到它,如果你的代码与Java 1.4迁移到Java 1.5。 不知道为什么,他们马虎吧,也许他们不得不这样做的。