龙珠

修炼自己与发现世界

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是什么?

 

参考资料:

  1. 《Java编程思想》

  2. nan

  3. (Java)相同和相等:equals() == "=="?

  4. 深入Java关键字null

  5. Java:null是什么?