Java 解惑2

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型。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值