首页 > 代码库 > JAVA编程思想(2) - 操作符(二)
JAVA编程思想(2) - 操作符(二)
5. 直接常量
-一般来说,如果程序里使用了“直接常量”,编译器可以准确的知道要生成什么样的类型,但有时候却是模棱两可的。这时候需要我们对编译器进行适当的“指导”
-直接常量后面的后缀字符标示了它的类型。
-指数记数法:e代表“10的幂次”
-注意如果编译器能够正确的识别类型,就不必在数值后附加字符,例如语句: float f4 = 200;
不存在含糊不清的地方,所以200后面不需要加L,但是对于:float f4 = 1e-43f;
编译器通常会将指数作为双精度数(double)来处理,所以假如我们没这个f就会出错
6.按位操作符
-按位操作符用来操作基本数据类型中的单个“比特”(bit),即二进制位
-“与”操作符(&)、“或”操作符(|)、按位“非”(~)、“异或”操作符(^)
7.移位操作符
-移位操作符操作的运算对象也是二进制。移位操作符只可用来处理“整数”类型
-左移位操作符(<<)按位左移,在低位补0;“有符号”右移位操作符(>>)按位右移,若符号位为正,则在高位插入0,;若符号位为负,则在高位插入1,。Java中增加了一个“无符号”右移操作符(>>>),无论正负,都在高位插入0。这一操作符是C和C++没有的。但在进行“无符号”右移结合赋值操作的时候,可能还会有这样的问题:如果对byte或short值进行这样的右移操作,可能得不到正确的结果。它们会先被转换为int类型,再进行右移操作,然后“截断”,赋值给原来的类型,在这种情况下可能还会有-1的结果。
-如果对char、byte、short类型进行移位操作,那么会先被统一转换为int类型,并且结果也是int类型。而且只有数值右端的低5位才有用,这样防止我们移位超过int型值所具有的位数。long类型也是一样的数值右端的低6位才有用。
8.三元操作符if-else
-三元操作符也称为条件操作符,因为它有三个操作数。
-表达式形式:boolean-exp ? value0 : value1,如果boolean-exp是true的话,就计算value0,否则就计算value1
9.字符串操作符+和+=
-这个操作符在java中有一项特殊用途:连接不同的字符串。
-与C++相比,尽管操作符重载在Java中更容易实现,但仍过于复杂,所以Java程序员不能像C++和C#程序员那样实现自己的重载操作符。
-字符串操作符有一些很有趣的行为,如果表达式以一个字符串起头,那么后续所有的操作数都必须是字符串型。
10.使用操作符时常犯的错误
-使用操作符时一个常犯的错误是,即使对表达式如果计算有点不确定,也不愿意使用括号。
-在C和C++中,一个常见的错误如下:
while (x = y) { //..... }
程序员很明显想要测试是否“相等”(==),而不是进行赋值操作。在C和C++中,如果y是一个非零值,那么这种赋值的结果是true,而这样会得到一个无限循环。在Java中,这个表达式的结果不是布尔值,而编译器期望的是一个布尔值。由于Java不会自动的将int数值转换为布尔值,所以这里会抛出一个编译时的错误。所以这个错误在Java中永远不会出现,除非x和y都为布尔值
-Java中有一个与C和C++中类似的问题,即使用按位"与"和按位“或”代替逻辑“与”和逻辑“或”。Java编译器可防止这个错误发生,因为它不允许我们随便的把一种类型当作另一种类型来用。
11.类型转换操作符
-Java会将一种数据类型自动转换成另一种。类型转换运算允许我们显式的进行这种类型转换,或者在不能自动进行转换的时候强制进行类型转换。
-在C和C++,类型转换可能是件头疼的事情,但是在Java中,类型转换则是一种比较安全的操作。然而如果要执行一种名为“窄化转换”的操作(也就是说将能容纳信息量大的数据类型转换成无法容纳那么多信息的类型),就可能会有数据丢失的危险。此时,编译器会强制我们进行类型转换。
-Java允许我们把任何基本数据类型转换成别的基本数据类型,但是布尔型除外。“类”数据类型不允许进行类型转换。
12.提升、Java中没有sizeof
-通常,表达式中出现的最大的数据类型决定了表达式最终结果的数据类型。
-在C和C++中,sizeof()操作符告诉你为数据项分配的字节数。在C和C++中,需要使用sizeof()的最大原因是为了“移植”。而在Java中,不需要sizeof()操作符来满足这方面的需要,因为所有的数据类型在所有的机器中的大小都是相同的,我们不必考虑移植问题——它已经被设计在语言中了。