想详细了解清楚运算符,就先要了解各个名词概念
运算:对常量和变量进行操作的过程
运算符:对常量和变量进行操作的符号
操作数:参与运算的数据
表达式:用运算符将常量和变量连接起来组成的式子(不同运算符连接的式子体现的是不同类型的表达式)
一.算术运算符
- 算术运算符的运算规则遵循四则运算规律 — 先算小括号,再算乘除,最后算加减
运算符 | ~~~~ 运算 ~~~~ | ~~~~ 范例 ~~~~ | ~~~~ 结果 ~~~~ |
---|---|---|---|
+ | 正号 | +3 | 3 |
- | 负号 | b=4; -b=? | -4 |
+ | 加 | 5+5 | 10 |
- | 减 | 6-4 | 2 |
* | 乘 | 3*4 | 12 |
/ | 除 | 5/5 | 1 |
% | 取模 | 5%5 | 0 |
++ | 自增(前) | a=2;b=++a; | a=3;b=3; |
++ | 自增(后) | a=2;b=a++; | a=3;b=2; |
- - | 自减(前) | a=2;b=- -a; | a=1;b=1; |
- - | 自减(后) | a=2;b=a- -; | a=1;b=2; |
+ | 字符串连接 | “he”+“llo” | “hello” |
- 代码演示
public class CalcDemo{ public static void main(String[] args){ int a = +3; System.out.println(a);//3 int b = 4; System.out.println(-b);//-4 System.out.println(5+5);//10 System.out.println(6-4);//2 System.out.println(3*4);//12 System.out.println(5/5);//1 System.out.println(5%5);//0 int c = 2; int d = ++c; System.out.println(c);//3 System.out.println(d);//3 int e = 2; int f = e++; System.out.println(e);//3 System.out.println(f);//2 int g = 2; int h = --g; System.out.println(g);//1 System.out.println(h);//1 int i = 2; int j = i--; System.out.println(i);//1 System.out.println(j);//2 System.out.println("he"+"llo");// hello } }
关于自增和自减
只要存在自增和自减符号,那么该变量的值最后一定会 +1 或 -1
即当 自增 和 自减 单独使用时,符号在前在后所得的结果都一样
当自增和自减符号参与运算(赋值、打印、小括号等)时:
前自增:先 +1 ,再运算
后自增:先运算,后 +1
前自减:先 -1 ,再运算
后自减:先运算,后 -1
二.赋值运算符
- 赋值运算符有:= 、+= 、-=、*=、/=、%=
- = 是最基本的赋值运算符,其余的都是根据 = 扩展而成
- += :将运算符两边的数字相加,结果赋值给左边变量(其余同理,更换标记部分的符号)
- eg:a += b; 等同于 a = a + b;
//代码演示 public class GiveValueDemo{ public static void main(String[] args){ int a = 13; int b = 2; System.out.println(a+=b);//15,a=a+b;a=15 System.out.println(a-=b);//13,a=a-b;a=13 System.out.println(a*=b);//26,a=a*b;a=26 System.out.println(a/=b);//13,a=a/b;a=13 System.out.println(a%=b);//1,a=a%b;a=1 System.out.println(a=b);//2 System.out.println(a==b);//true } }
- 除了 = 外,其余赋值运算符中都包含了强制类型转换
//代码演示 public class ChangeValueDemo{ public static void main(String[] args){ short s = 1; s = s + 1;//此句错误,因为等号右边存在变量,s+1的值为int类型,不能赋给short类型的s s += 1;//此句正确,s = 2,已经在内部完成了强制类型转换,即 s = (short)(s + 1) } }
三.关系运算符
- 关系运算符又称为比较运算符,得到的结果都为boolean类型
运算符 | ~~~ 运算 ~~~ | ~~~ 范例 ~~~ | ~~~ 结果 ~~~ |
---|---|---|---|
== | 恒等于 | 4==3 | false |
!= | 不等于 | 4!=3 | true |
< | 小于 | 4<3 | false |
> | 大于 | 4>3 | true |
<= | 小于等于 | 4<=3 | false |
>= | 大于等于 | 4>=3 | true |
instanceof | 检查是否是类的对象 | “hello” instanceof String | true |
注意:
- instanceof 不能用于检查基本数据类型,只能用于检查引用数据类型
- == 运算符,在连接基本数据类型时,比较的是数值是否相等;连接引用数据类型时,比较的是地址值
- “==” 不要误写为 “=”
//代码演示
public class CompareDemo{
public static void main(String[] args){
System.out.println(4==3);//false
System.out.println(4!=3);//true
System.out.println(4<3);//false
System.out.println(4>3);//true
System.out.println(4<=3);//false
System.out.println(4>=3);//true
System.out.println("hello" instanceof String);//true
}
}
四.逻辑运算符
- 逻辑运算符一般用于连接布尔类型的值,或者连接结果为布尔类型值的表达式
& - 并且(AND):运算符两边全为true,最后结果才为true,否则都为false
| - 或者(OR):运算符两边只要存在true,结果就为true,两边全为false,结果为false
^ - 异或(XOR):运算符两边相同为false,不同为true
!- 非 :对某布尔类型的值或表达式取反//代码演示 public class LogicDemo{ public static void main(String[] args){ boolean b1 = true; boolean b2 = false; System.out.println(b1&b2);//false System.out.println(b1|b2);//true System.out.println(b1^b2);//true System.out.println(!(b1&b2));//true System.out.println(4>3 & 5>6);//false //表达式可以连接多个 } }
- 逻辑运算符的优先级:& > | > ^ (AND > OR > XOR)
- 短路运算符
短路与:&&
& 和 && 的运算结果在任何时候都是相同的
& 和 && 不能随意调换,在 & 运算中,若后面的结果取决于前面的结果时,就不能调换,此时只能用 &
使用 & 时,若前面的结果已经出现false,后面的表达式仍要进行计算,最终结果为false
使用 && 时,若前面的结果已经出现false,后面的表达式就不再进行计算,最终结果为false
短路或:||
与短路与同理(前面出现true,则最终结果为true,后面表达式不会再执行)//代码演示 public class AndDemo{ public static void main(String[] args){ int x1 = 3; int y1 = 4; System.out.println((x1++ > 3)&(y1++ > 4));//false System.out.println(x1);//4 System.out.println(y1);//5 int x2 = 3; int y2 = 4; System.out.println((x2++ > 3)&&(y2++ > 4));//false System.out.println(x2);//4 System.out.println(y2);//4 //y1=5,y2=4 int x3 = 3; int y3 = 4; System.out.println((++x3 > 3)|(++y3 > 4));//true System.out.println(x3);//4 System.out.println(y3);//5 int x4 = 3; int y4 = 4; System.out.println((++x4 > 3)||(++y4 > 4));//true System.out.println(x4);//4 System.out.println(y4);//4 //y3 = 5,y4 = 4 } }
- &、|、^ 三个运算符也可以用来连接数字,此时这三个运算符称为 — 位逻辑运算符(针对二进制位进行操作)
位逻辑运算符连接的数字只能是整数
运算过程:先将整数转为二进制数,再逐位进行运算,把0当成false,1当成truepublic class Demo{ public static void main(String[] args){ System.out.println(15&2);//2 System.out.println(15|2);//15 System.out.println(15^2);//13 } }
具体过程:
15的二进制数:00000000 00000000 00000000 00001111
2的二进制数: ~~~ 00000000 00000000 00000000 00000010
& ~~~~~~~~~~~~~~~~~~~ 00000000 00000000 00000000 00000010 ----> 2
| ~~~~~~~~~~~~~~~~~~~~ 00000000 00000000 00000000 00001111 -----> 15
^ ~~~~~~~~~~~~~~~~~~~ 00000000 00000000 00000000 00001101 -----> 13
五.位运算符
- 位运算符分为位左移运算符、位右移运算符
- 位右移运算符中又分为无符号右移和有符号右移
- 位运算是直接对二进制进行运算
运算符 | 运算 | 范例 |
---|---|---|
<< | 左移 | 3 << 2 = 12(3 * 2 * 2 = 12) |
>> | 右移 | 3 >> 1 = 1(3/2 = 1) |
>>> | 无符号右移 | -10 >>> 2 = 1073741821 |
~~ << :空位补0,被移除的高位丢弃
~~ >> : ~ 被移位的二进制最高位是0,右移后空缺位补0;最高位是1,空缺位补1
~ >>> : 无论最高位是0还是1,右移后空缺位都补0
左移 x 位,相当于乘 2 的 x 次方
右移 x 位,相当于除 2 的 x 次方
六.三目运算符
- 三目运算符也称为三元运算符
- 格式:(关系表达式)?表达式1:表达式2;
- 此处关系表达式的数据类型是布尔类型
- 若关系表达式为true,结果为表达式1,否则为表达式2
- 表达式1和2的最终结果是一个明确的值
//代码演示 public class ThreeEyesDemo{ public static void main(String[] args){ int a = 100; int b = 20; int max = (a>b)?a:b; System.out.println(max);//100 String s = (a<b)?"ssss":"bbbbb"; System.out.println(s);//bbbbb } }
//三目运算符嵌套案例1 //需求:分数>=90:A,80-89:B,70-79:C,60-69:D,60以下:E public class StudentScoreDemo{ public static void main(String[] args){ int score = 77; String level = score>=90?"A":score>=80?"B":score>=70?"C":score>=60?"D":"E"; System.out.println(level);//C } }
//三目运算符嵌套案例2 //需求:找出a,b,c三个整数的最大值 public class SearchMax{ public static void main(String[] args){ int a = 10; int b = 20; int c = 30; //第一种方法: int max1 = a>b?a:b; int max2 = max1>c?max1:c; System.out.println(max2); //第二种方法: int max3 = a>b?a>c?a:c:b>c?b:c; System.out.println(max3); //第三种方法: int max4 = a>b? && a>c? a:b>c?b:c; System.out.println(max4); } }
- 注意事项:
当三目运算符的值被接收时,表达式 1 和 表达式 2 所得值的数据类型必须一致
eg:int a = 10; int b = 20; int max = a>b?a:b;
此处a,b,max 都为 int 类型
当三目运算符的值不被接收时,表达式 1 和 表达式2 所得值的数据类型可以不同
eg:int a = 10; int b = 20; a<b?“hhh”:b;
此处 a 和 b 为 int 类型,表达式1为String类型,此句可直接进行打印,即
System.out.println(a<b?“hhh”:b);//输出结果为 hhh