Java编程基础-运算符
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 | = *= /= %= += -= <<= >>= >>>= &= ^= /= | 从右向左 |