Java:基本操作符
一、算数操作符(+、-、*、/):
除号/:整数除法会会接去掉结果的小数位,而不是聪明兮兮的四舍五入。想要四舍五入的结果,用Math.round()吧。
二、一元加减操作符(-、+):
一元加减操作符和二元加减操作符都是用相同的符号。根据表达式,编译器会自动判断出使用的哪一种。如:
x = a * -b;
但是,为了阅读方便,有时更明确的写成:
x = a * (-b);
更有利于阅读。
三、前缀、后缀递增和递减(++、--):
前缀:先加减后运算;
后缀:先运算后加减。
执行顺序上,易错:
int a = 5; int b = ++a + a-- + a-- + a++ + --a + --a; System.out.println("a:"+a+". b:"+b);
在计算b时:
第一个++a执行完毕,整体为6,a=6;
第二个a--执行完毕,整体为12,a=5;
第三个a--执行完毕,整体12+5=17,a=4;
第四个a++执行完毕,整体17+4=21,a=5;
第五个--a执行完毕,整体21+(5-1)=25,a=(5-1)=4;
第六个--a执行完毕,整体25+(4-1)=28,a=(4-1)=3.
我们查看下运行结果是一致的,如下:
a:3. b:28
四、关系操作符(==、!=)
关系操作符的结果是一个布尔值,计算的是操作符的值之间的关系。
不过对于“==”而言,有个陷阱。就是在Object.java中,equals方法是通过“==”来判断的。而“==”和“!=”比较的是对象的引用(即对象的地址)而非“对象的值”,因此,很容易出错。具体见我之前写的文章对二者的比较:(Java)相同和相等:equals() == "=="?
五、逻辑操作符(&&、||、!)
根据参数的逻辑关系,生成布尔值。
六、按位操作符(&、|、~、^)
按位操作符用来操作整数基本数据类型中的单个比特(bit),即二进制位。
int c = 1; int d = ~c; System.out.println("c:"+Integer.toBinaryString(c)+".d:"+Integer.toBinaryString(d)); System.out.println("c ^ d:"+(c ^ d));
运行结果:
c:1. d:11111111111111111111111111111110 c ^ d:-1
按位操作符除了“~”是一元操作符之外,其余均可以和“=”联合使用。
对于布尔值,可以还行按位“&”、“|”、“^”的运算,但不能执行按位的“~”运算(可以执行逻辑的非运算,即“!”)。
七、移位操作符(<<、>>、>>>)
移位操作符只可用来处理整数类型。
操作符均表示:对操作符左边的数进行移位操作,移位个数操作符右边的数。
“有符号”的右移位操作符(>>)使用“符号扩展”:若符号为正,则在高位插入0;若符号为负,则在高位插入1。
“无符号”的右移位操作符(>>>)使用“零扩展”:无论正负,都在高位插入0(这个是C/C++中没有的)。
附录:
一、NaN是什么?
百度百科nan的介绍如下:
NaN,是Not a Number的缩写。
NaN 用于处理计算中出现的错误情况,比如 0.0 除以 0.0 或者求负数的平方根。由上面的表中可以看出,对于单精度浮点数,NaN 表示为指数为 emax + 1 = 128(指数域全为 1),且尾数域不等于零的浮点数。IEEE 标准没有要求具体的尾数域,所以 NaN 实际上不是一个,而是一族。不同的实现可以自由选择尾数域的值来表达 NaN,比如 Java 中的常量 Float.NaN 的浮点数可能表达为 01111111110000000000000000000000,其中尾数域的第一位为 1,其余均为 0(不计隐藏的一位),但这取决系统的硬件架构。Java 中甚至允许程序员自己构造具有特定位模式的 NaN 值(通过 Float.intBitsToFloat() 方法)。比如,程序员可以利用这种定制的 NaN 值中的特定位模式来表达某些诊断信息。
二、null、Null、NULL是什么?
Java中只有null,其他表述都是错误的。
Java中的null关键字,是用来标识一个不确定的对象。它可以赋给引用类型变量,不能赋给基本类型变量。
null本身不是Java中的对象,也不是Object的实例。测试代码如下:
System.out.println("null instanceof Object:"+(null instanceof Object));
返回结果为false。
具体对null的讲解请见我的文章:Java:null是什么?
参考资料: