java运算符分类
java运算符有一下几类:
1,赋值运算符:=
“=”号并不是我们数学上的等于号的意思,而是赋值运算符,主要是将一个数值赋给一个变量,或者将一个变量的值赋给另一个变量,也可以把一串公式的值赋予一个变量。
如 :
int a=3;就是3这个数值赋给a这个int型变量。
如:
int b=2;
int c=b;第一行便是将2赋给b,第二行就是将b的值赋给c。则c的值也应该是2。
如:
int a=2;
int b=3;
int c=a+b;最后一行,就是将a+b的结果赋给c。所以c的值为5。、
--------------------------------------------------------------------------------------------------------------------------
2,算数运算符:+(加)、-(减)、*(乘)、/(除)、%(取余)、++(自增)、--(自减)
加减乘除与基本的运算法则是一致的。但其中“除”需要注意由于数值类型问题而引起的小数部分忽略。
如:
int a=1;
int b=a/2;由于a/2等于0.5,0.5是浮点型数值,即小数型数值;而int是整数型,所以b就是整数型变量,整数型变量的小数部分是直接忽略的,所以b最后的值便是0,而非0.5。
如果不想让小数部分的内容忽略掉,就需要将b定义为浮点型变量。
如:
int a=1;
float b=a/2;此时,b的结果就为0.5了。
取余(%):
int a=22;
int b=a%5;22余5,便是22除以10,等于4,余2,之后取余数2,赋给b,最终b的值为2。
自增(++)、自减(--):
int a=1;
a++;
int b=1;
b--;a++即为a=a+1,最后a的值为2;同理b--即为b=b-1,最后b的值为0。
-----------------------------------------------------------------------------------------------------------------------------
3,关系运算符:>(大于)、<(小于)、>=(大于等于)、<=(小于等于)、==(等于)、 =!(不等于)、instanceof。
这些关系运算符都主要用于判断。返回值为Boolean类型,即要么是true(真),要么是false(假)。
其中“==”主要判断两边的值是否相等。
instanceof 主要判断一个对象是否属于某个指定的类或其子类的实例。(目前我还为学到对象,类,实例等相关内容所以instanceof的用法先不作介绍。)
----------------------------------------------------------------------------------------------------------------------------
4,逻辑运算符:&&(逻辑与)、||(逻辑或)、!(非)
逻辑运算规则如下(含短路运算):
public class learning3 {
public static void main(String[] args) {
//逻辑运算:&&(逻辑与) ||(逻辑或) !(逻辑非 即取反)
boolean a=true;
boolean b=false;
System.out.println(a&&b);// 有一个为false,则结果为false,否则为true
System.out.println(a||b);// 有一个为true,则结果为true,否则为false
System.out.println(!a);//将true变为false,将false变为true
System.out.println(!b);
//短路运算
int c=3;
boolean d=(c<1)&&(c++<6);
System.out.println(c);//c的结果为3
//由于逻辑与运算,有一个为假,则结果为假,后面的直接不用运算
//所以c++<6并没有执行,c没有自增,依然为3
System.out.println(d);
定义 boolean a=true; boolean c=true;
boolean b=false; boolean d=false;
那么有 :
a&&b 的结果为 false, a&&c的结果为 true, b&&d的结果为 false。
a||b的结果为 true, a||c的结果为 true, b||d的结果为 false。
!a的结果为 false, !b的结果为 true。
由于逻辑与(&&)只需要有一个为假(false),这最终结果就为假(false),逻辑或(||)只需有要一个为真(true),则最终结果就为真(true)。
在上述代码中 int c=3;
boolean d=(c<1)&&(c++<6);
由于c<1为假(false),所以b的结果就为假(false),对于后面(c++<6)这段代码是真,是假已经无所谓了,所以这段代码就没有意义去执行。最终c++不会被执行,c++<6也不会去判断了。所以如果接下来输出c的结果
System.out.println(c);
最后c依然等于3。
这便是短路运算。
当然,此例只对逻辑与(&&)进行了验证。逻辑或(||)也有相同特性,只需要前面的一个为真,那么后面的代码也就没有意义去执行了。读者可以自行去验证。
----------------------------------------------------------------------------------------------------------------------------
5,位运算符:&(与)、|(或)、^(异或)、~(取反)、<<(左移)、>>(右移)、 >>>(无符号右移)
其中 &(与)、|(或)、^(异或)、~(取反) 的运算规则如下:
//位运算 与& 或| 异或^ 取反~
int n=0x2b;//二进制为:0010 1011
int m=0x38;//二进制为:0011 1000
System.out.println(n&m);//结果为0010 1000 即32+8=40
System.out.println(n|m);//结果为0011 1011 即32+16+8+2+1=59
System.out.println(n^m);//结果为 0001 0011 即16+2+1=19
System.out.println(~n);//取反后为 1101 0100 最高位为符号位,1为负号,此位保留。
//其他位需按位取反后加一,结果为1010 1100=-44
System.out.println(~m);//取反后为 1100 0111 最高位为符号位,1为负号,此位保留。
//其他位需按位取反后加一,结果为1011 1001=-57
由此可知,&(与)运算中,两个数的二进制数 相同位为1,则该位为1,否则为0。
|(或)运算中,两个数的二进制数 相同位为0,则该位为0,否则为1。
^(异或)运算中,两个数的二进制数 相同位一样,则为0,不同则为1。
取反运算中,java是对一个数的补码进行全位(包括符号位)取反的,因为计算机是存储的该位的补码,所以取反运算~,是对一个数的补码进行操作的。
对补码的运算,可以参考我这一篇文章: java 取反运算
<<(左移)、>>(右移)、>>>(无符号右移)
左移<<:无论是正数还是负数,低位都补零,高位舍去。
如int a=8;
A=a<<2;
由于a是正数,所以其补码和原码一样,为:
0000 0000 0000 0000 0000 0000 0000 1000
左移两位变为:
0000 0000 0000 0000 0000 0000 0010 0000(该为A的补码)
最高位为0,说明A为正数,转换为原码依然是:
0000 0000 0000 0000 0000 0000 0010 0000(正数原码、反码、补码相同)
将其转换为十进制数就是A=32
-------------------------------------------
又如:
int b=-8;
B=<<2;
其原码为:
1000 0000 0000 0000 0000 0000 0000 1000
将其转换为补码,即原码符号位不变,其余位取反加一,得:
1111 1111 1111 1111 1111 1111 1111 0111 +1
补码为:
1111 1111 1111 1111 1111 1111 1111 1000
然后对补码向左移两位的:
1111 1111 1111 1111 1111 1111 1110 0000 (该为B的补码)
最高位为1,则B为负数,将其转换为原码,(对补码求补码,的该数的原码)即求上一行二进制数的补码:
符号位不变,其余位取反再加一:
1000 0000 0000 0000 0000 0000 0001 1111 +1
得原码为:
1000 0000 0000 0000 0000 0000 0010 0000
将其转换为十进制数,的B=-32
-------------------------------------------------
右移>>:正数高位补0,低位舍去,负数高位补1,低位舍去。
如int a=8;
A=a>>2;
8为正数,原码、反码、补码都一样,为:
0000 0000 0000 0000 0000 0000 0000 1000
将其补码向右移2位得A的补码为:
0000 0000 0000 0000 0000 0000 0000 0010(A的补码)
最高位为0,则说明A为正数,将其转换为原码依然是:
0000 0000 0000 0000 0000 0000 0000 0010
将原码转换为十进制数得:A=2
-------------------------------------------------
如int b=-8;
B=b>>2;
-8的原码为:
1000 0000 0000 0000 0000 0000 0000 1000
将其转换为补码,即符号位不变,其余位取反加一得:
1111 1111 1111 1111 1111 1111 1111 0111 +1
其补码为:
1111 1111 1111 1111 1111 1111 1111 1000
将补码向右移两位得(负数高位补1):
1111 1111 1111 1111 1111 1111 1111 1110(得到B的补码)
将B的补码转换为原码,即求B得补码的补码:
得:1000 0000 0000 0000 0000 0000 0000 0001+1
得原码为:1000 0000 0000 0000 0000 0000 0000 0010
将其转换为十进制数,得B=-2
-------------------------------------------------
无符号右移>>>:无论正数负数,高位都补一,低位都舍去。
如int a=8;
A=a>>2;
8为正数,原码、反码、补码都一样,为:
0000 0000 0000 0000 0000 0000 0000 1000
将其补码向右移2位得A的补码为:
0000 0000 0000 0000 0000 0000 0000 0010(A的补码)
最高位为0,则说明A为正数,将其转换为原码依然是:
0000 0000 0000 0000 0000 0000 0000 0010
将原码转换为十进制数得:A=2
--------------------------------------------------
如int b=-8;
B=b>>>2;
-8的原码为:
1000 0000 0000 0000 0000 0000 0000 1000
将其转换为补码,即符号位不变,其余位取反加一得:
1111 1111 1111 1111 1111 1111 1111 0111 +1
其补码为:
1111 1111 1111 1111 1111 1111 1111 1000
将补码向右移两位得(此时,负数的高位也补零):
0011 1111 1111 1111 1111 1111 1111 1110(为B的补码)
最高位为0,说明B为正数,其补码、反码、原码都一样,得B的原码为:
0011 1111 1111 1111 1111 1111 1111 1110
将其转换为十进制数得:B=1,073,741,822
---------------------------------------------------------------------------------------------------------------------------------
6,条件运算符:()?():()
条件运算符主要用于判断和选择。
它的语法为:
(x)?(y):(z)
如果x成立,即x为true,那么就执行y语句,否则就执行z语句。
例如:
int a=10;
String b=a<5?"充能不足":"充能完成"
System.out.println(b);最终一定会输出:充能不足 这个结果。
我们来分析一下这段代码的逻辑:
首先定义了一个int型的变量a,并将a的值赋为10.
然后定义一个字符串型的变量b,令b等于条件运算符最终运算出的一个结果。
首先,条件运算符会判断 a<5这个条件,发现a<5不成立,所以就只能执行 冒号: 之后的语句,
即,条件运算符最终运算得到的结果为“充能完成”这段字符,最终将“充能完成”这段字符赋给b
然后输出b,就得到 充能完成 这个结果。
当然,这是a<5不成立的情况,如果将a的值,改为3,即开始第一行的代码改成 int a=3;
则a<5就成立,那么最后就会执行冒号: 之前的语句,即最终结果为 “充能不足”。
7,扩展赋值运算符:+=(加等于)、-=(减等于)、*=(乘等于)、/=(除等于)
这些运算符相当于偷懒的写法。
例如int a=2;
int b=4;
a+=b; 即 a=a+b,即a的结果为a= 2+4=6
------------------------
a-=b; 即 a=a-b,即a的结果为a= 2-4=-2
-------------------------
a*=b; 即 a=a*b,即a的结果为a= 2*4=8
--------------------------
a/=b; 即 a=a/b,即a的结果为a= 2/4=0.5 (由于a为int 型,所以小数部分省略,a=0)
8,运算符优先级
总结了这么多,最后来说一说运算符优先级的事。

其实优先级这种东西实在不好记,不过我们只需记得数学中的基本运算符的优先级即可,如加减乘除的优先级。
其余优先级记不清楚没关系,我们只需要按着运算的逻辑步骤多加括号()即可。
如:int a=2;
int b=4;
int c=3;
int d=1;
int e=6;
int f=3;
int g=7;
int h=4;
((((a+b)/c)+d+(e%f)-g)/h)
最终我们只需依次从内向外拆括号即可。
那么最终结果是什么呢?
为-1
读者可以自行运算一下。最好是草稿纸上一步一步运算哦。