3.14使用操作符时常犯的错误
使用操作符时一个常犯的错误就是,即使对表达式如何计算结果不确定,也不愿意使用括号。
这个问题在Java中仍然存在。
在C和C++中,一个特别常见的错误
1 | while(x = y){ |
很明显是“==”而不是“=”,但是因为C和C++的机制,如果y是一个非0值m,这会造成一个死循环。而在java中它期望的是一个boolean结果,而int不会转成boolean,自然会报错的。
3.15 类型转换器操作符
类型转换(cast)的原意就是“模型铸造”。在适当得时候,Java会将一种数据类型自动转换成另一种。例如,假设我们为浮点变量赋以一个整数值,编译器会自动将int转为float。类型转换允许我们显式地进行这种类型转换,或者在不能自动进行转换的时候进行强制转换。
1 | int i = 200; |
在C和C++中,类型转换有时会让人头痛。但在Java中,类型转换则是一种比较安全的操作。然而,如果执行一种名为窄化转换(narrowing conversion)的操作(也就是说,将能容纳更多信息的数据类型转换成无法 容纳那么多信息的类型),就会可能面临信息丢失的危险。此时编译器会强制我们去进行类型转换。而对于扩展转换(widening conversion),则不必进行显示转换。
Java允许我们把任何基本数据类型转换成别的基本数据类型,布尔类型除外。
3.15.1 截尾和舍入
在执行窄化转换时,必须注意截尾与舍入的问题。例如浮点型转整型。
29.7转化成int,结果不是30而是29。
因为float或者double转为整型时进行的是截尾,如果想要进行舍入需要使用java.lang.Math中的round()方法。
3.15.2 提升
如果对基本数据类型执行算术运算或按位运算,大家会发现,只要类型比int小(char、byte、short),那么在运算前,这些值会自动转换成int。最终的结果也是int。如果想把结果赋值给小的类型,就必须使用类型转换。
3.16 Java没有sizeof
在C和C++中,sizeof()操作符可以告诉我们数据项分配的字节数。在C和C++中,需要使用sizeof()的最大原因是为了“移植”。不同的数据类型在不同的机器上可能会有不同的大小。
Java不需要sizeof()是因为所有数据类型在所有机器的大小都是相同的。我们不必考虑移植问题——————因为它已经被设计在语言中了。
3.17 操作符小结
能够对布尔型值进行的运算非常有限。我们只能赋予它true和false值,并测试它为真还是为假,而不能将布尔值相加,或对布尔值进行其它运算。
我们要在类型的提升上多多关注。
3.18 总结
这一张花了很多时间,主要是自己的时间不是很多,希望自己能在2018年之前看完一半吧。