Java编程基础-运算符

[亡魂溺海] 提交于 2019-11-29 15:12:03

Java中的运算符大致分为:算术运算符、赋值运算符、关系运算符、逻辑运算符位运算符五类。

(1)、算术运算符:+  -  *  /  %  ++  --

(2)、赋值运算符:=  +=  -=  *=  /=  %=

(3)、关系运算符:==  !=  >  >=  <  <=

(4)、逻辑运算符:&  |  !  ^   &&   ||

(5)、位运算符:&  |  ~  ^  <<  >>  >>>


一、算术运算符

按照操作数数目分为单目运算符(一元运算符)和双目运算符(二元运算符)。

1、单目运算符,只有一个操作数。

单目运算符有: + (正)  - (负)  ++  (自增)   --  (自减)。

++  (自增) 和--  (自减)放在操作数前面,称为前自增(自减),要先对被操作数作自增1或自减1运算,再进行其它的运算操作。

反之,++  (自增) 和--  (自减)放在操作数后面,称为后自增(自减),要先进行其它运算,再进行自增1或自减1运算。

public class Demo {

	public static void main(String[] args) {
		int a = 5;
		int x, y;
		x = +a;// 正值
		System.out.println("x=" + x);// 打印结果:x=5
		y = -a;// 负值
		System.out.println("y=" + y);// 打印结果:y=-5

		// 前自增
		int i = 5;
		System.out.println("++i=" + (++i));// 打印结果:++i=6
		System.out.println("i=" + i);// 打印结果:i=6
		// 后自增
		i = 5;
		System.out.println("i++=" + (i++));// 打印结果:i++=5
		System.out.println("i=" + i);// 打印结果:i=6
		// 前自减
		int j = 12;
		System.out.println("--j=" + (--j));// 打印结果:--j=11
		System.out.println("j=" + j);// 打印结果:j=11
		// 后自减
		j = 12;
		System.out.println("j--=" + (j--));// 打印结果:j--=12
		System.out.println("j=" + j);// 打印结果:j=11
	}

}

2、双目运算符,有两个操作数,运算符在操作数之间。

双目运算符有: + (加)  - (减)  * (乘)  / (除)  % (求余或者取模)。

三点注意

(1)、在java程序中的运算符不可以省略,在数学上y=2x,可以省略乘号,但java里必须写y=2*x;

(2)、在进行除法运算时,当除数和被除数都是整数时,得到的结果也是一个整数(会忽略小数部分)。如果除法运算有小数参与,得到的结果会是一个小数.

(3)、在进行求余(%)运算时,运算结果的正负取决于被模数(%左边的数)的符号,与模数(%右边的数)的符号无关。如:-5%3=-2;而5%-3=2;

求余记住:任意正整数%2,结果要么是0,要么是1,用于切换条件。左边如果小于右边,结果是左边。左边如果等于右边,结果是0。右边是1,结果为0。

public class Demo {

	public static void main(String[] args) {
		int x = 5, y = 12;
		System.out.println(x + "+" + y + "=" + (x + y));// 相加结果:5+12=17
		System.out.println(x + "-" + y + "=" + (x - y));// 相减结果:5-12=-7
		System.out.println(x + "*" + y + "=" + (x * y));// 相乘结果:5*12=60
		System.out.println(y + "/" + x + "=" + (y / x));// 相除结果:12/5=2
		// 求余
		System.out.println(5 % -3);// 模数为负数求余结果:2
		System.out.println(-5 % 3);// 被模数为负数求余结果:-2
		System.out.println(12 % 5);// 普通求余结果:2
		System.out.println(12 % 2);// 模数为2求余结果:0
		System.out.println(12 % 1);// 模数为1求余结果:0
		System.out.println(12 % 12);// 被模数与模数相等求余结果:0
		System.out.println(5 % 6);// 被模数小于模数求余结果:5

	}

}


二、赋值运算符

赋值运算符的作用就是将常量、变量或表达式的值赋给某一个变量。

赋值运算符有:

= (赋值,注意与==区别)  把等式右边的值赋给等式左边的变量。

+= (加等)把等式左右两边的值相加之后的值赋给左边的变量。  

-= (减等)   把等式左右两边的值相减之后的值赋给左边的变量。

*=  (乘等) 把等式左右两边的值相乘之后的值赋给左边的变量。

/=  (除等) 把等式左右两边的值相除之后的值赋给左边的变量。

%= (模等) 把等式左右两边的值求余之后的值赋给左边的变量。

三点注意

(1)、在java中可以通过一条赋值语句对多个变量进行赋值。示例:
int x,y,z;
x=y=z=5;//为三个变量同时赋值。
错误写法:int x=y=z=5;

(2)、除了=,其它都是特殊的赋值运算符,以+=为例,x+=3就相当于x=x+3,首先会进行加法运算x+3,再将运算结果赋值给变量x。其它赋值运算符都可以此类推。

(3)、在使用+=、-=、*=、/=、%=运算符进行赋值时,强制类型转换会自动完成,程序不需要做任何显示的声明。


三、关系运算符

关系运算符用于对两个数值或变量进行比较,其结果是一个布尔值,即true或false。

关系运算符有:==(相等)  !=(不等)   >(大于)   >= (大于等于)   <(小于)   <=(小于等于)

注意:不能将关系运算符==写成赋值运算符=,二者是不同的运算符,运算结果是不同的。切记!

public class Demo {

	public static void main(String[] args) {

		System.out.println(12 == 21);// 判断是否相等,结果为:false
		System.out.println(5 != 6);// 判断是否不相等,结果为:true
		System.out.println(4 > 3);// 判断4是否大于3,结果为:true
		System.out.println(4 >= 4);// 判断4是否大于等于4,结果为:true
		System.out.println(3 < 5);// 判断3是否小于5,结果为:true
		System.out.println(6 <= 5);// 判断6是否小于等于5,结果为:false

	}

}


四、逻辑运算符

逻辑运算符用于对布尔型的数据进行操作,其结果仍是一个布尔型。

逻辑运算符有:

&(与):两边都为真结果为真,否则为假。   

|(或)  :两边只要有一个为真,结果为真,否则为假。

! (非)  :非真则为假,非假则为真。

^ (异或)   :两边相同则为假,两边不同则为真。

&&(短路与) :两边都为真结果为真,否则为假。

||(短路或):两边只要有一个为真,结果为真,否则为假。

特别注意:

&与&&的区别:&无论左侧条件为真还是为假,都会计算判断右侧的条件。而&&当左侧条件为假时,不会计算判断右侧的条件,当左侧为真,才会继续判断右侧的条件。因为与运算结果为真必须满足左右两边条件都为真。

|与||的区别:|无论左侧条件为真还是为假,都会计算判断右侧的条件。而||当左侧条件为真时,不会计算判断右侧的条件,当左侧为假时,才会继续判断右侧的条件。因为或运算结果为真只要满足一边为真即可。

程序开发中建议使用&&(短路与) 和||(短路或),提高执行效率。

public class Demo {

	public static void main(String[] args) {
		// !非 真变假,假变真
		System.out.println(!(12 > 21));// 结果为:true
		System.out.println(!true);// 结果为:false
		// ^异或 两操作数一真一假,结果才为真,否则为假
		int x = 18;
		System.out.println(x >= 18 ^ x < 18);// 结果为:true
		System.out.println(x < 18 ^ x == 18);// 结果为:true
		System.out.println(x != 18 ^ x > 18);// 结果为:false
		System.out.println(x == 18 ^ x <= 18);// 结果为:false
		// 逻辑与&、短路与&& 两操作数同真,结果为真,否则为假
		int y = 5;
		System.out.println(y > 5 & y <= 5);// 结果为:false
		System.out.println(y >= 5 && y < 5);// 结果为:false
		System.out.println(y != 5 & y < 5);// 结果为:false
		System.out.println(y == 5 && y <= 5);// 结果为:true
		// 逻辑或|、短路或|| 两操作数同假,结果为假,否则为真
		int z = 2;
		System.out.println(z != 18 | z > 18);// 结果为:true
		System.out.println(z >= 18 || z == 18);// 结果为:false
		System.out.println(z <= 18 | z > 18);// 结果为:true
		System.out.println(z != 18 || z == 18);// 结果为:true
		// 短路与测试
		int i1 = 18;
		System.out.println(i1 != 18 && i1++ > 18);// 结果为:false
		System.out.println("i1:" + i1);// 由于左边条件为false,所以右边的表达式未作判断,i1结果为:18
		int i2 = 18;
		System.out.println(i2 != 18 & i2++ > 18);// 结果为:false
		System.out.println("i2:" + i2);// 左边条件为false,右边依然需要判断,i1结果为:19
		// 短路或测试
		int j1 = 18;
		System.out.println(j1 == 18 || j1++ > 18);// 结果为:true
		System.out.println("j1:" + j1);// 由于左边条件为true,所以右边不作判断,j1结果为:18
		int j2 = 18;
		System.out.println(j2 == 18 | j2++ > 18);// 结果为:true
		System.out.println("j2:" + j2);// 左边条件为true,右边依然需要判断,j2结果为:19
	}

}

奉上逻辑运算符真值表:



五、位运算符

位运算符是针对二进制数的每一位进行运算的符号,它是专门针对数字0和1进行操作的。

位运算符有:&(按位与) |(按位或) ~(取反) ^(按位异或) <<(左移)  >>(右移)  >>>(无符号右移)

位运算操作的真值表与逻辑运算符的真值表完全相同。只是位运算的操作数和结果都是二进制整数。

(1)、按位与运算符“&”是将参与运算的两个二进制数进行与运算,如果两个二进制位都为1,则该位的运算结果为1,否则为0.

例如:将6和11进行与运算,6对应的二进制数是00000110,11对应的二进制数是00001011.具体演算过程如下:

00000110

                 &     00001011

                         00000010

运算结果为00000010,对应数值为2.

(2)、 按位或运算符“|”是将参与运算的两个二进制数进行或运算,如果二进制位上有一个值为1,则该位的运行结果为1,否则为0.

例如:将6与11进行或运算。

00000110

                 |      00001011

                         00001111

运算结果为00001111,对应的数值是15.

(3)、取反运算符“~”只针对一个操作数进行操作,如果二进制位是0,则取反值为1,如果是1,则取反值为0.

例如:将6进行取反运算。

  ~     00000110                                 

         11111001

运算结果为11111001,对应的数值是-7

(4)、按位异或运算符“^”是将参与运算的两个二进制数进行异或运算,如果二进制位相同,则值为0,否则为1.

例如:将6和11进行异或运算。

00000110

         ^      00001011

                 00001101

运算结果为00001101,对应数值是13.

一个数异或同一个数两次,结果还是那个数。

(5)、左移运算符“<<”就是将操作数所有二进制位向左移动一位,运算时,右边的空位补0,左边移走的部分舍去。(一个整数向左移动几位就乘以2的几次幂),越移越大。

例如:将11左移动一位。

<<1        00001011                                

               00010110

运算结果为00010110,对应数值是22.(亦或是11*2的1次方=22)

(6)、右移运算符“>>”就是将操作数所有二进制位向右移动一位。运算时,左边的空位根据原数的符号补0或1(原来是负数就补1,是正数就补0)(一个整数向右移动几位就除以2的几次幂,高位时0就补0,是1就补1),越移越小。

例如:将11右移一位

>>1        00001011                                

               00000101

运算结果为00000101,对应的数值是5.

(7)、无符号右移运算符“>>>”就是将操作数所有二进制位向右移动一位,左边的空位补0(即不考虑原数的正负情况,最高位都用0补)

例如:将11无符号右移一位

>>>1      00001011                                

               00000101

运算结果为00000101,对应的数值是5.


特殊的运算符:条件运算符(三目运算符)

格式为:<表达式1>?<表达式2>:<表达式3>

执行流程:先计算表达式1的值,当表达式1为true,则把表达式2的值作为整个表达式的结果;当表达式1为false,则将表达式3的值作为整个表达式的结果。


附运算符优先级表

优先级 运算符 结合性
1 . [] () 从左向右
2 ++ -- ~ !(数据类型) 从右向左
3 */ % 从左向右
4 + - 从左向右
5 << >> >>> 从左向右
6 < ><= >= 从左向右
7 == != 从左向右
8 & 从左向右
9 ^ 从左向右
10 | 从左向右
11 && 从左向右
12 || 从左向右
13 ?: 从右向左
14 =  *=  /= %=  +=  -= <<=  >>=  >>>= &=  ^=  /= 从右向左

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!