java中的运算符大体分为 算术运算符 ,关系运算 ,位运算符 ,逻辑运算符 等,本文的目的在于大体列出其中这些运算符及其使用的方式和运行的结果,重点在于表示几个易错点。
一,算术运算符
它分为单目运算和 双目运算符及三目运算符,其中单目 运算符有:+(取正),-(取负),++(自增),--(自减); 而双目运算符包括:+,-,*,/,%,;三目运算符为a>b ? true : false
这一部分,我们首先提到到一个边界的问题
int a=10 ; int b=4; System.out.println("a+b = "+(a+b)) ;//输出 a+b = 14; System.out.println("a-b = "+(a-b)) ;//输出 a-b = 6; System.out.println("a*b = "+(a*b)) ;//输出 a*b = 40; System.out.println("-a = "+(-a)) ;//输出 -a = -10; System.out.println("a%b = "+(a%b)) ;//输出 2,%即a除于b的余数
System.out.println("a/b = "+(a/b)); //输入2,注意,两个整数相除,会自动的取整,并且按照截尾的规则获值
上面的运算输出结果, 我想不用我解释,大家都很容易理解,于是乎,我们就想到了两个整数的运算将产生一个正确的整数,事实却未必是如此。
假如我们将上面代码的例子改为
int a=1<<30 ; int b=1<<30; System.out.println("a+b = "+(a+b)) ;//输出 a+b = -2147483648; System.out.println("a-b = "+(a-b)) ;//输出 a-b = 0; System.out.println("a*b = "+(a*b)) ;//输出 a*b = 0; System.out.println("-a = "+(-a)) ;//输出 -a = -1073741824;
从输入的结果来看,我们可以发现 a+b 和 a*b都不是我们要的结果, 这个结果导致的原因就是int数据类型的长度是 32 bit,当一个运算的结果超出了这个大小存储的空间时,
就会得到不正确的值。虽然一般情况下,不会有这种情况,但并不能保证不会出现这样的情况, 所以在编写相关的代码时,要考虑的越位的边界问题。
接着我们 注意的是++(自增),--(自减),两个运算符,这也是很多java面试时很多公司挺喜欢出来的笔试试题,
对于自增和自减运算符,又可以透过其所在的位置,分为 “前缀式” 和 “后缀式”,对两种方式可以按以下的方式去理解;
前缀式运算就是先对变量自身增(减)然后再将其用于运算
后缀式运算就是先将变量用于运算,再进行增(减)
从上面两点说明来看,对于自增运算符,我们可以将它拆分成两条语句来执行(实际上java也是这样做的, 使用javap 你可以看到它将生产两条语句,所以对自增(减)运算不是线程安全的);
如
int i=0; count=1; count=count +(i++);
可拆分成
int i=0; count=1; count=count +i; i=i+1;
而
int i=0; count=1; count=count +(++i);
可拆分为
int i=0; count=1; i=i+1; count=count +i;
对于自减运算也是一样的拆分规则。
二,关系运算
该类运算符主要用于判断两个对象的关系,相等或者大于等于等等 ,其包括 等于符号:==,不等于符号: != ,大于符号:>, 小于符号:<,大于等于符号: >= ,小于等于符号: <=
关于关系运算符的几个注意点在于:
1,除了==,!=,其他的所以关系运算符都只能用于除boolean外基本数据及字符串
2,==,!=在对象的比较时,不是值比较, 而是比较两个引用时否相同
3,在很多语言中if(a=b){},这得写法编译是不会报错, 并且永远是true,即if里面的代码总会运行,但在java中除非 a和b都是boolean型,否则这样的写法编辑是不通过的 。
三,位运算符
与(&)、非(~)、或(|)、异或(^)
&:当两边操作数的位同时为1时,结果为1,否则为0。如1100&1010=1000
| :当两边操作数的位有一边为1时,结果为0,否则为1。如1100|1010=1110
~:0变1,1变0
^:两边的位不同时,结果为1,否则为0.如1100^1010=0110
四,逻辑运算符 与(&&)、非(!)、或(||)
逻辑与和逻辑非提供短路原则,即对于与运算,一定出现false的结果,将不再运行后面的 条件,而对于或运算,一旦出现了true,将不再运行后面的条件
五,赋值运算符 = += -= *= /= %= &= ^= |= <<= >>=
六,位移运算符 << 带符号左移 >>带符号右移 >>> 无号右移
<<带符号左移:按照操作符右侧指定的位数将左边的操作数向左移动(地位补0),在不越界的情况下,相当于每移动一位都乘于一个2
>>带符号右移:按照操作符右侧指定的位数将左边的操作数向右移动,若符号位为正,则在高位插入0,若符号位为负则插入1,
>>> 无号右移:按照操作符右侧指定的位数将左边的操作数向右移动,无论符号位为正负,都在高位插入0
七,运算符的优先级
按优先级从高到低排列如下:[ ] ( ) ++ -- ! ~ instanceof * / % + - << >> >>> <> < = > \ == != &^& & || ? := op= 。