目录
前言
算式运算符
⚙赋值运算符
关系运算符
逻辑运算符
位运算符
移位运算符
条件运算符
运算符优先级
任何一个程序都离不开计算问题,运算符代表着表达式之间进行何种运算,所以我们要熟练掌握各种运算符的使用方法。
了解单目操作运算符、双目运算符、三目运算符
单目运算符:即运算符只对一个表示式执行操作,如a++...。
双目运算符:即运算符对两个表示式进行操作 a+=b。
三目运算符:即运算符对三个表示式进行操作true ? 6 : 8。
+、-、*、 /、 %
算式运算符也就是我们平常经常用到的,也比较简单,使用/和%有些是我们要小心的。
使用/号的注意事项
1.分母不能为0,否则会抛出异常,分子和分母都为整形时,得到的结果为也为整数。
2.当分子和分母都为整形数据时,得到的结果为也为整数。
%(取模运算符)号的使用
总结:对于x%y,计算结果的正负与x有关。
=、+=、-=、*=、/=、%=、^=、&=、|=、>>=、<<=,>>>=,++,--。
int a = 5;
a += 5;//相当于a = a+5
a *= 5;//相当于a = a*5
a /= 10/2;相当于a = a/(10/2)
a %= 2+3;相当于a = a%(2+3)
a++;//相当于a = a+1;
a--;//相对于a = a-1;
...
值得注意的一点就是。
error:a是一个short类型的变量,小于四字节类型整形变量之间进行运算时,会先提升到int类型再参有运算。
right:赋值运算符运算时,会将计算的结果自动帮我们进行类型转换。
注意:前置++和后置++的区别,a++、++a。如果单独使用则没区别,都是使a自增。前置++a先使a自增,再使用a;后置++,先使用a,a再自增。
>、>=、<、<=、==、!=
int a = 10;
int b = 5;
System.out.println(a>b);//true
System.out.println(a=b);//true
System.out.println(a<=b);//false
System.out.println(a==b);//false
System.out.println(a!=b);//true
注意:关系运算符计算的最终结果是只有两个,true或false,通常称结果为true或false的表示式为布尔表示式。
&&、||、、!
&&(双与运算符):&&左右两边一定要是一个布尔表达式。
布尔表达式1 && 布尔表达式2
System.out.println(true && false);//false
System.out.println(false && true);//false
System.out.println(false && false);//false
System.out.println(true && true);//true
结论:布尔表示式1或布尔表示式2为假,则整体结果为假,布尔表达式1和布尔表示式2为真,则整体结果为真。
注意:&&运算时,若布尔表达式1为假,则不执行布尔表示式2,因此也称&&为短路与。
||(双或运算符):||左右两边一定要是一个布尔表达式。
布尔表达式1 || 布尔表达式2
System.out.println(true || false);//true
System.out.println(false || true);//true
System.out.println(false || false);//false
System.out.println(true || true);//true
结论 :布尔表示式1或布尔表示式2为真,则整体结果为真,布尔表达式1和布尔表示式2为假,则整体结果为假。
注意:若布尔表示式1为真则不执行表示式2,因此也称||为短路或。
!(非运算符):!运算符是一个单目操作符,!的右边一定是一个布尔表示式
!布尔表示式
System.out.println(!true);//false
System.out.println(!false);//true
结论:如果布尔表示式为真,结果为真,如果布尔表示式为假,结果为真。
&、|、~,^
位运算符就是对数据的补码进行操作,&、|、^是双目运算符,表示式两边一定是个整数;~单目操作符,也表达式需要是整数。
&(按位与运算符):
int a = 6;
int b = -5;
int c = b&a;
a补码:
00000000 00000000 00000000 00000110
b补码
11111111 11111111 11111111 11111011
a&b
00000000 00000000 00000000 00000110
11111111 11111111 11111111 11111011 &
--------------------------------------
00000000 00000000 00000000 00000010
//按位与,一个为0则为0,两个为1则为1
//c=2
|(按位或运算符):
int a = 7;
int b = 12;
int c = b|a;
a补码:
00000000 00000000 00000000 00000111
b补码
00000000 00000000 00000000 00001100
a&b
00000000 00000000 00000000 00000111
00000000 00000000 00000000 00001100 &
--------------------------------------
00000000 00000000 00000000 00001111
//按位或,一个为1则为1,两个为0则为0
//c=15
~(按位取反运算符):
int a = 5;
int b = ~a;//-6
a补码:
00000000 00000000 00000000 00000101
~a得到的结果也为补码
11111111 11111111 11111111 11111010
~a反码
11111111 11111111 11111111 11111001
~a原码
10000000 00000000 00000000 00000110
^(按位异或运算符:
int a = 70;
int b = 12;
int c = b^a;
a补码:
00000000 00000000 00000000 01000110
b补码
00000000 00000000 00000000 00001100
a&b
00000000 00000000 00000000 01000110
00000000 00000000 00000000 00001100 &
--------------------------------------
00000000 00000000 00000000 01001010
//按位异或,找不同,不同为1,相同为0
//c=74
>>、<<、>>>
移位运算符针对的也是数据的补码进行操作。
>>(右移运算符):
表达式>>右移多少位
int a = 5;
int c = a>>2;
a的补码:
00000000 00000000 00000000 00000101
00000000 00000000 00000000 000001
a>>1
00000000 00000000 00000000 00000001
前面缺少位补符号位
c = 1
<<(左移运算符):
表达式<<左移多少位
int a = 5;
int c = a<<2;
a的补码:
00000000 00000000 00000000 00000101
000000 00000000 00000000 00000101
a<<1
00000000 00000000 00000000 00010100
后面缺上的位补0
c = 20
>>>(无符号右移运算符):
表达式>>右移多少位
int a = -5;
int c = a>>>2;
a的补码:
11111111 11111111 11111111 11111011
11111111 11111111 11111111 111110
a>>1
00111111 11111111 11111111 11111110
前面缺少的位只补0
c = 1073741822
? :
布尔表示式?表示式1:表达式2
System.out.println(true?5:8);//5
System.out.println(false?5:8);//8
结论 :布尔表达式为真,执行表达式1,布尔表达式为假,结果为表达式2,并于表达式的结果作为整个运算的结果。
优先级 | 运算符 | 结合性 |
1 | () [] . | 从左向右 |
2 | ! +(正) -(负) ~ ++ -- | 从右向左 |
3 | * / % | 从左向右 |
4 | +(加) -(减) | 从左向右 |
5 | << >> >>> | 从左向右 |
6 | < <= > <= | 从左向右 |
7 | == != | 从左向右 |
8 | & | 从左向右 |
9 | ^ | 从左向右 |
10 | | | 从左向右 |
11 | && | 从左向右 |
12 | || | 从左向右 |
13 | ?: | 从右向左 |
14 | = += -= *= /= %= &= |= ~= <<= >>= >>>= |
从右向左 |