4.初级问题
System.out.println(12345+54321);
System.out.println(12345+5432l);
你能发现这两个语句有什么区别么?后一个5432l最后一位是小写的L,而第一个是真正的54321.
小写字母L和数字1几乎是一样的。为避免混淆,千万不要使用小写的1来作为long型字面常量的结尾或是
作为变量名。java从C中继承很多,也许当初允许用小写的L来编写long型字面常量本身是个错误。
5.十六进制的趣事
System.out.println(Long.toHexString(0x100000000L + 0xcafebabe));
System.out.println(Long.toHexString(0x100000000L + 0xcafebabeL));
比较这两个程序输出的结果一样吗?
不一样
cafebabe
1cafebabe
十进制字面常量有一个很好的属性,所有的十进制字面常量都是正的,要想写一个负的十进制常量
可以使用(-)取反操作符。但是十六进制和8进制并不具备这种性质。他们有正也有负,如果十六进制
8进制字面常量最高位被置位了,那么他们就是负数。0xcafebab是一个int常量,最高位被置位这是一个负数
等于十进制的-889275714.首先int型变为long型0xcafebabe===》0xffffffffcafebabeL
加上0x0000000100000000L等于0x00000000cafebabeL
而第二就会得到所期望的结果。混合类型的计算可鞥会差生混淆,尤其是十六进制和八进制字面常量
无需显示的减号符号就可以表示负的数值。所以最好避免混合类型的计算。同时也会有这样的争辩:
负的十六进制和八进制字面常量应该被禁用。你觉得呢?
6.条件操作符
<span style="white-space:pre"> </span> char x = 'X';
int i = 0;
System.out.println(true ? x : 0);
System.out.println(false ? i : x);
看起来两个条件操作符都应该打印"X"
但是一个打印了“X”,一个打印了“88”。
这涉及到了如何确定条件表达式结果类型。它有一个冗长的规则,核心是如下三点:
1.如果类型相同,那么它就是条件表达式的类型
2.如果一个类型是T(byte,short,char),另一个是int类型的常量那么类型就是T
3.否则,运用二进制提升。条件表达式的类型就是被提升之后的类型。
第一个system语句运用了第二个规则,因为0是int常量。所以输出的是char型
第二个system语句运用了第三个规则,因为i是变量,所以输出的是int型。