-
关系运算
. < >= <= != ==(注意是2个等号)
关系运算返回的结果是布尔类型(TRUE\FSLAE)
System.out.println(5>3==true); System.out.println(2<3==true); System.out.println(5>=3==true); System.out.println(2>4==false); System.out.println(3!=4==true); System.out.println(3==3==true);左结合性 System.out.println(5>3==true); System.out.println(5>3==true); System.out.println('a'=='a'true); //char类型也可以进行比较
-
三目运算(3个操作数,简化了分支结构,且返回部分支持任意类型)
int age = 18; String result = age>=18?"成年":"未成年"; System.out.println(result); //逻辑表达式(布尔类型)?true的返回值:fa
三目运算也可以连用
int input=0; int result = (input==-1?0:(input>0?1:-1)); System.out.println(result); //运行结果是-1
-
赋值运算
增强赋值运算,不会有数据类型默认提升的问题。
+= -= *= /= %= |= &=
int i=1; i+=3;//i=i+3 byte byte 1=2; byte1+=3;//这样是能通过编译 byte1=byte1+3;//这样是通不过的
-
位运算
-
非 ~
-
与 &
-
或 |
-
左移<<
int i=4;//0100 //-> 0001 0000 int result=i<<2;//向左移动,右边补0 system.out.println(result==16); int i2=-4;//0100 //-> 0001 0000 int result=i2<<2;//向左移动,右边补0 system.out.println(result==-16); //左移操作(i*2的n次方),以乘以2的n次方的效率高,是一种高效率的运算方式。
-
右移>>
int i=4;//向右移动,除以2的n次方 int result=i>>2; system.out.println(resule==16) int i2=-4;//向右移动,除以2的n次方 int result=i2>>2; system.out.println(resule==-16)
-
无符号右移>>>(左边一律补0)(只适用于字节截取)
int i=4; int result=i>>>2;//无符号右移 System.out.println(result==16) int i2=-4;//1110 1111 -> 0111 0111(补码) int result=i2>>>2;//无符号右移 System.out.println(result==1073741823);
-
如何区分位运算和逻辑运算?
位运算操作数是(二进制)数字,逻辑运算操作数是布尔值。
-
-
逻辑运算(两边的操作数都为布尔类型)
与 & &&
单与和双与的区别:
在java中都可以进行逻辑运算,运算结果都符合真值表
双与(&&)有短路作用,能够确定最终逻辑运算的结果时,后面的代码将不被运行。
单 与(&),在能够确定最终逻辑运算的结果时,后面的代码也会运行。
利用双与防止空指针异常
或| ||
单与双的区别
同理,如果左边为TRUE时,不管右边是TRUE还是FALSE,结果都是TRUE。单或(|)还会继续执行后边的代码,而双或(||)将不执行后面的代码
非
异或
System.out.println(true ^ true ==false); System.out.println(flase ^ true==true);
真值表
与运算:全TRUE为TRUE,见FLASE为FLASE
或运算:全FLASE为FLASE,见TRUE为TRUE
-
运算的优先级
-
操作数越少,优先级越高
-
如果不能确定优先级,需要加括号
-
单目运算的结合性是从右到左
-
优先级相同的运算符按照事先约定的结合方向进行。
-