1、概念
对常量和变量进行操作的符号
2、分类
算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、三目运算符
3、详解
A、算术运算符
+、-、*、/、%、++、--
+:在java中有三种作用,代表正号,做加法运算,字符串连接符。
整数相除只能得到整数。若想得到小数,需把其中一个数据类型转换为浮点型。
/:获得的是两数相除的商;%获得的是两数相除的余数。
%运算规则:
左边的绝对值小于右边的绝对值时,结果是左边
左边的绝对值等于或者是右边的绝对值的倍数时,结果是0
左边的绝对值大于右边的绝对值时,结果是余数
自加(++),自减(--)运算符:
++,自加,对原有数据进行+1
--,自减,对原有数据进行-1
++、--用法:
a、单独使用
int a = 1; a++/++a/a--/--a; System.out.println(a);
b、参与运算
放在操作数的前面,先进行自增或者自减,在参与运算
放在操作数的后面,先运算,再进行自增或者自减
1 int a = 3; 2 int b; 3 b = a++; 4 c = ++a; 5 System.out.println("a = "+a); 6 System.out.println("b = "+b); 7 System.out.println("c = "+c);
c、问题:哪句代码会出错?理由是什么?
1 byte b = 10; 2 b++; //运算符,底层还会自动转换类型,相当于b = (byte)(b + 1) 3 b = b + 1;//int转换byte可能会损失精度(运算时,类型转换为int,而b是byte类型) 4 System.out.println(b);
B、赋值运算符
a、基本的赋值运算符:=
作用:将运算符右侧的值赋值给左边的变量
a = 10;
b、扩展:+=、-=、*=、/=、%=
+=:把左边和右边的值相加,再赋值给左边。
-=:把左边和右边的值相减,再赋值给左边。
*=:把左边和右边的值相乘,再赋值给左边。
/=:把左边和右边的值相整除,再赋值给左边。
%=:把左边和右边的值求余数,再赋值给左边。
c、问题:查看程序是否有问题,请指出
1 short s1 = 1; 2 s = s + 1; //类型错误,高类型向低类型转换 3 short s1 = 1; 4 s += 1; //2
C、关系运算符(比较运算符)
a、运算符
==、!=、>、>=、<、<=
b、注意
结果为boolean类型,即不为true,就为false
D、逻辑运算符
a、运算符
&、|、^、!、&&、||(注意:逻辑运算符一般用于连接boolean类型的表达式)
&:逻辑与(and),只有符号两边同时为true时,结果方为true(有false,则false)
|:逻辑或(or),只有符号两边同时为false时,结果为false(有true,则true)
^:逻辑异或,同时为true或为false时,结果为false(两边相同为false,两边不同为true)
!:逻辑非,取反操作(非true,为false)
&&:逻辑与,只有符号两边同时为true时,结果方为true(有false,则false);与&不同的是,&&当遇到符号左边为false时,右边不在执行(短路效果)
1 int a = 10;int b = 15; 2 //System.out.println((++a == 10) & (++b == 15)); 3 //System.out.println(a); //11 4 //System.out.println(b); //16 5 System.out.println((++a == 10) && (++b == 15)); 6 System.out.println(a); //11 7 System.out.println(b); //15
||:逻辑或,只有符号两边同时为false时,结果为false(有true,则true);与|不同的是||只要满足一个条件,后面的条件就不再进行判断(短路效果),而|则对所有的条件进行判断。
int a = 10;int b = 15; System.out.println((++a == 11) | (++b == 15)); System.out.println(a); //11 System.out.println(b); //16 //System.out.println((++a == 11) || (++b == 15)); //System.out.println(a); //11 //System.out.println(b); //15
b、案例演示
1 class Demo_Operator { 2 public static void main(String[] args) { 3 //&、|、^、! 4 //0<x<1 5 //x>0 & x<1;//&:逻辑与、并且、and 6 int a,b,c; 7 a = 10; 8 b = 15; 9 c = 20; 10 System.out.println("a < b & b < c结果为:" + (a < b & b < c)); //true & true = true 11 System.out.println("a < b & b > c结果为:" + (a < b & b > c)); //true & false = false 12 System.out.println("a > b & b < c结果为:" + (a > b & b < c)); //false & true = false 13 System.out.println("a > b & b > c结果为:" + (a > b & b > c)); // false & false = false 14 //&:只有两边同时为true时,结果方为true; 15 System.out.println("a < b && b < c结果为:" + (a < b && b < c)); //true & true = true 16 System.out.println("a < b && b > c结果为:" + (a < b && b > c)); //true & false = false 17 System.out.println("a > b && b < c结果为:" + (a > b && b < c)); //false & true = false 18 System.out.println("a > b && b > c结果为:" + (a > b && b > c)); // false & false = false 19 //&&:只有两边同时为true时,结果方为true;遇到false,下面的不执行 20 System.out.println("a < b | b < c结果为:" + (a < b | b < c)); //true & true = true 21 System.out.println("a < b | b > c结果为:" + (a < b | b > c)); //true & false = true 22 System.out.println("a > b | b < c结果为:" + (a > b | b < c)); //false & true = true 23 System.out.println("a > b | b > c结果为:" + (a > b | b > c)); // false & false = false 24 //|:只有两边同时为false时,结果才为false; 25 System.out.println("a < b ^ b < c结果为:" + (a < b ^ b < c)); //true & true = false 26 System.out.println("a < b ^ b > c结果为:" + (a < b ^ b > c)); //true & false = true 27 System.out.println("a > b ^ b < c结果为:" + (a > b ^ b < c)); //false & true = true 28 System.out.println("a > b ^ b > c结果为:" + (a > b ^ b > c)); // false & false = false 29 //^:两边相同为false,两边不同为true 30 System.out.println("!true结果为:"+(!true)); // false 31 System.out.println("!false结果为:"+(!false)); // true 32 33 } 34 }
E、位运算符
a、运算符
&、|、^、~、>>、>>>、<<、
b、案例演示
&:位与,有0则0
|:位或,有1则1
^:位异或,相同则0,不同则1
System.out.println(4 ^ 5 ^ 5); //4 一个数被另一个数异或两次,该数本身不变。
~:取反,按位取反
代码:
1 class Demo_Opertor1 { 2 public static void main(String[] args) { 3 /* 4 位运算符 5 &、|、^、~ 6 &:有0则0 7 |:有1则1 8 ^:相同则0,不同则1 9 ~:按位取反 10 */ 11 System.out.println(6 & 3); //2 12 //将6转换为二进制:110;3转换为二进制:011 13 //有0则0 14 /* 15 110 16 & 011 17 ----------- 18 010 19 */ 20 System.out.println(6 | 3); //7 21 //将6转换为二进制:110;3转换为二进制:011 22 //有1则 23 /* 24 110 25 | 011 26 ----------- 27 111 28 */ 29 System.out.println(6 ^ 3); //5 30 //将6转换为二进制:110;3转换为二进制:011 31 //相同则0,不同则1 32 /* 33 110 34 ^ 011 35 ----------- 36 101 37 */ 38 System.out.println(~6); //-7 39 //将6转换为二进制:110;3转换为二进制:011 40 //按位取反 41 /* 42 ~ 00000000 00000000 00000000 00000110 43 11111111 11111111 11111111 11111001 取反(负数补码) 44 -1 00000000 00000000 00000000 00000001 45 ------------------------------------------------------ 46 11111111 11111111 11111111 11111000 反码 (高位不变,其他位取反) 47 10000000 00000000 00000000 00000111 -7 48 */ 49 System.out.println(4 ^ 5 ^ 5); //4 一个数被另一个数异或两次,该数本身不变。 50 } 51 }
c、练习:交换两个整数位置(不需要第三方变量)
1 class Demo_opertor { 2 public static void main(String[] args) { 3 int a = 10; 4 int b = 20; 5 //方法1 6 a = a ^ b; 7 b = a ^ b; 8 a= a ^ b; 9 //方法2:加减。有弊端,两数相加之和有可能超出int的取值范围 10 /* 11 a = a + b; 12 b = a - b; 13 a = a - b; 14 */ 15 System.out.println("a = "+a); 16 System.out.println("b = "+b); 17 } 18 }
d、<< 、>>、 >>>
<<:左移,左边最高位丢弃,右边补齐0
>>:右移,最高位是0,左边补0,最高位是1,左边补1
>>>:无符号右移,无论最高位是0/1,左边补齐0
class Test1 { public static void main(String[] args) { /* <<:左移,左边最高位丢弃,右边补齐0 >>:右移,最高位是0,左边补0,最高位是1,左边补1 >>>:无符号右移,无论最高位是0/1,左边补齐0 */ System.out.println("5 << 1 ="+(5 << 1)); // 10 System.out.println("5 << 2 ="+(5 << 2)); // 20 //向左移动几位,就是乘2的几次幂 /* 00000000 00000000 00000000 00000101 5的补码 (0)00000000 00000000 00000000 00001010 10的补码(正数的反码、补码都是其本身,即10) (00)00000000 00000000 00000000 00101000 40的补码(正数的反码、补码都是其本身,即40) */ System.out.println("12 >> 1 ="+(12 >> 1)); // 6 System.out.println("12 >> 2 ="+(12 >> 2)); // 3 //向右移动几位,就是除2的几次幂 /* 00000000 00000000 00000000 00001100 12的补码 >>1 00000000 00000000 00000000 00000110(0) 6的补码 >>2 00000000 00000000 00000000 00000011(00) 3的补码 */ } }
e、最有效率的算出5*16
采用位移运算符<<,5<<4。
F、三目运算符
格式:(关系表达式)?表达式1:表达式2;
执行流程:如果关系表达式结果为true,执行表达式1,关系表达式结果为false,执行表达式2
代码:求两个数的最大值和三个数的最大值
class Test_Max { public static void main(String[] args) { int a = 10; int b = 20;
int c = 25; int M; M = (a < b) ? b : a;
S = (M > c) ? M : c; System.out.println("最大值 = " + s); } }