我们知道在Java中,必不可少的就是运算符,那么常见的运算符都有哪些呢?Java中的运算符主要分为六种:算数运算符、赋值运算符、比较运算符、逻辑运算符、位运算符和三元运算符。下面我们来一一介绍一下。
目录
算数运算符
算数运算符主要包括:加(+)、减(-)、乘(*)、除(/)、取余(%)、自增(++)、自减(--)、连接符(+)。
其中加减乘除我们都十分熟悉,就不一一详解了,不过需要注意的有几点:
1.计算机在进行计算时,同样是从左往右依次计算,不过会将括号中的当作一个整体。
2.当计算时有大类型参与运算,那么运算结果一定是大类型。比如:int a=10;byte b=20; 那么a+b的最终结果一定是int类型的。
3.当byte、short类型的数值进行运算时,会自动转为int类型。
4.需要注意的是,正数/0在程序中是会报异常的:ArithmeticException(算数异常)。
我们主要来说一下其他几个:
%取余运算:
我们知道,取余运算的结果是余数,比如a%b就算的是a除以b的余数,运算规则是a%b=a-(a/b)*b
例如:7%4=7-(7/4)*4=7-4=3
同时,做取余运算时,先按正数进行取余,然后看%左边数字的符号,如果为正,结果为正,如果为负,那么结果为负。
++/--(自增/自减运算)
就相当于在自身原先的基础上自增或自减1。
需要注意的是,i++和++i是不同的,当++在变量之前,则表示先自增,然后赋值,当++在变量之后,则表示先赋值,再自增,下面我们从代码来看这两个的区别:
int a1=10;
int a2=10;
int b=a1++;
int c=++a2;
System.out.println(b);
System.out.println(c);
注意看,a1和a2都是10,那么我们让b和c一个等于a1++,一个等于++a2,结果为b=10,c=11。这就是因为a1是先将自己的值赋给了b,然后再进行自增运算,而a2是先进行自增运算,然后再将自己的值赋给c。所以会有这种差别。
+(连接符)
在Java中,“+”有多种意思,当加号的两边有字符串的存在时,加号会变成连接符,将两端拼接起来成为一个新的字符串,而当两边都不为字符串时,加号就代表运算符。下面考一考大家,这两条语句分别输出什么呢?
System.out.println("hello"+1+5);
System.out.println(1+5+"hello");
这两个看上去是一样的,可是输出结果却不一样,第一个输出:hello15,第二个输出:6hello。
有人会问了,为什么第一个不输出hello6?1和5明明不是字符串,+应该作为运算符才对啊。其实你忽略了一个很重要的要点,也是我们上面提到的注意事项的第一项,计算机进行计算时,是从左往右依次进行计算的,也就是说,计算机是把hello和1拼在一起之后,再让这个新的字符串+5,所以两个+都是连接符了。那如果我要让他输出hello6,怎么办呢?很简单,把1+5用括号括起来就好了,因为括号里的是一个整体。
还有要注意的一点是,连接符仅对字符串类型生效,对char类型无效,比如我输出'a'+1,他就会输出98,因为他会自动根据a这个字符在字符集中的编号来运算。
赋值运算符
赋值运算符右边十二种,=(等于)、+=(加等)、-=(减等)、*=(乘等)、/=(除等)、%=(取余等)、&=(与等)、|=(或等)、^=(异或等)、<<=(左移等)、>>=(右移等)、>>>=(无符号右移等)
这是什么意思呢,打个简单的比方: A+=B 就等价于 A=A+B ,把A和B相加的值赋给A, 其他的赋值运算符同理。
不过在Java中 A=B 一般不会称为A等于B,而是会称为把B的值赋给A或者令A等于B。
关系运算符
关系运算符又称为比较运算符
一共有七个运算符:==(等于)、!=(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)、instanceof(判断对象与实例的关系),他们返回的结果全部都是boolean类型
int a=10;
int b=20;
System.out.println(a==b);
System.out.println(a>b);
System.out.println(a<b);
System.out.println(a>=b);
他们的输出结果分别是:false、false、true、false
在这里要注意a=b和a==b是不同的,前者是赋值,后者是比较。
逻辑运算符
逻辑运算符有六种:&(与)、|(或)、!(非)、^(异或)、&&(短路与)、||(短路或),接下来我们一个一个介绍。
逻辑运算符主要是连接boolean类型的表达式或者值,比如我们要表达一个数大于0并且小于10,那么我们就会用到x>0&x<10。
下面我们看一下他们的运算规则:
&运算规则
两端有一个false结果都为false
格式 | 结果 |
---|---|
false&false | false |
false&true | false |
true&false | false |
true&true | false |
&也叫并且,我们可以这样来理解:
考试合格的要求是卷面成绩大于60并且平时成绩大于60,我们可以表示为:卷面成绩>60&平时成绩>60
那么这两个条件只要有一个没满足,考试就不合格,只有两个条件都满足,考试才合格。
|运算规则
只要有一个true,结果就为true
格式 | 结果 |
---|---|
false&false | false |
false&true | true |
true&false | true |
true&true | true |
|是或者的意思,A|B只要满足一个条件即可,用生活中的例子打个比方:我们要坐车,要么有核酸检测,要么有健康码和行程码,这两个条件只要满足一个,我们都可以坐车。
!运算规则
用于否定条件:!true=false !false=true
非否即是,非是即否
偶数个不改变,原因很好理解,双重否定表肯定嘛
^运算规则
两边相同为false,不同为true,“同性相斥、异性相吸”
男 ^ 男为false、女 ^ 女也为false
男 ^ 女为true
这里借男女关系打个比方,方便大家理解。
&&运算规则
&&的意思是短路与,他和&的运算规则是一模一样的,不过不同的是如果左边的值为false,那么右边的表达式就会被跳过,直接返回结果false。
我们知道,&运算中,只要有一个false,那么最终的结果就为false,那么当&&左边的表达式已经为false,就表明最终的结果一定为false,那么右边的表达式是true还是false已经不重要了,所以直接跳过不运算,可以提高效率。我们在运算时,一般都会采用&&而非&。
||运算规则
||的意思是短路或,和|的运算规则也一样,同时他也是可以提高计算效率,不过和&&相反,只要左边为true,那么他就跳过右边的表达式,直接返回true,理由和&&一样,只要左边为true,那就代表结果一定为true,右边的表达式是什么已经不重要,所以直接跳过。
位运算符
位运算符有:&(按位相与)、|(按位相或)、^(异或)、~(按位取反)、<<(按位左移)、>>(按位右移)
注意:位运算是直接对二进制补码进行运算,故而效率会高一些。
&、|、^运算规则
这些运算是用两个数的二进制的每一位进行比较,
运算规则如下:
&:有一个是0则为0
|:有一个是1则为1
^:相同取0,不同为1
下面演示一下,我们用3和4分别进行运算:
先写出3和4的二进制数:
3:00000011 &(有0则0):00000011 |(有1则1):00000011 ^(同0异1):00000011
4:00000100 00000100 00000100 00000100
结果 : 00000000: 000000111:7 00000111:7
其中位异或运算符还有一个特点:一个数据被另一个数据异或两次,该数本身不变。
~、<<、>>运算规则
这些运算是直接对单个数的计算
运算规则如下:
~:0变1,1变0
<<:左移,空位补0,被移除的高位丢弃 >>:右移,空缺位补0,最高位为1,高位补1,最高位为0,补0
演示:
~3=00000011按照0变1,1变0为:11111100,注意这里的结果是补码,我们推算回原码为10000100,结果为-4
3<<=00000011,将11向左移2位,空位补0得:00001100,结果为12
3>>=00000011.将11向右移2位,被移除丢弃得:00000000.结果为0
同时,我们要知道,<<的结果就是把<<左边的数乘以2的移动次幂 。例如3<< 结果 3* 2^2=12,举一反三,>>就是左边的数除以2的移动次幂,例如 40>>3 结果 40/2^3=5
三元运算符
三元运算符的格式为:(关系表达式)?表达式1:表达式2;
例如:int a=(10>20)?30:50; 结果为a=50;
也就是说,如果关系表达式的值为true,则运算后结果为表达式1,如果为false,则结果为表达式2
求两个数的最大值
用三元运算符可以求出两个数的最大值,用代码进行演示:
int a=30; int b=50; int Max=a>b?a:b;
显然,a>b是不对的,返回false,那么运算结果为表达式2,也就是b,所以Max=50,即最大值。
进阶一下,我们改良代码可以算出三个数中的最大值:
求三个数的最大值
int a=30; int b=50; int c=80; int i=a>b?a:b; int Max=i>c?i:c;
我们先用a和b比较,然后得到a和b的最大值,再用这个最大值和c比较,得出总的最大值。