计算机基础知识-运算符的优先级(位运算符、关系运算符、逻辑运算符等)前⾔
运算符优先级图片
情况说明:本⼈⽬前技术栈是Java这⼀套,所以这⾥提及的运算符测试都是在Java语⾔中的,不能保证在其他语⾔中也适⽤
⽂章⽬录
作为⼀个程序员,你⼀定遇到过写的代码在你的逻辑⾥⾯没有问题,但是⼀运⾏就error满天飞。下⾯来看⼀个踩坑场景,求取 n 与 2倍m 的和:
/**
* 求取 n 与 2倍m 的和
* @param n
* @param m
* @return
*/
public int sum(int n,int m){
return n + m <<1;// 错误
//return n + (m << 1);// 正确
}
如果问题出现在基本的运算符优先级上,那很难到问题的所在。并且,对于运算符的优先级掌握到位可以间接的节省代码的复杂度。
⼀、运算符分类
运算符可⽤于表⽰数据的运算、赋值和⽐较等。Java运算符分为:
1. 算术运算:+,-,*,/,%,++,--
2. 赋值运算:=,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=,>>>=
3. 位运算符:&,|,~,^,<<,>>,>>>
4. ⽐较运算符:>,>=,<,<=,==
5. 逻辑运算符:&&,&,||,|,!,^
6. 三⽬运算符:? :
⼆、运算符的说明
针对于三个操作数的叫做三⽬运算符(如?:),针对于两个操作数的叫做⼆⽬运算符(如 +),针对于⼀个操作数的叫做单⽬运算符(如++)。
1.算术运算
+:加法运算符
把运算符左右的两个数值加起来,也可作为字符串的连接运算符:
//1.数值相加
System.out.println(1+2);//put 3
//2.字符串拼接
System.out.println("a"+"b");//put ab
+运算符具有拼接字符串的功能,那么下⾯这个场景是怎样的:
System.out.println(1+2+"3");//到底是怎么样执⾏的?
它会先执⾏1+2=3,它也就等价于3+“3”,此时就是字符串的拼接,输出"33",这⾥涉及到int类型的3⾃动装箱为Intger类,之后在转化为String字符串进⾏拼接。
-:减法运算符
运算符左边减去运算符右边的数值。⽰例代码:
//2 - 1 == 1
System.out.println(2-1);//put 1
*:乘法运算符
运算符左边的数乘以运算符右边的数值。⽰例代码:
//2 * 3 == 6
System.out.println(2*3);//put 6
/:除法运算符
运算符左边除以运算符右边的数值。⽰例代码:
//4 / 2 == 2
System.out.println(4/2);//put 2
当除法运算符左右的数都是整数类型(int和Long)时,计算得到的结果也为整数,此时除数不能为0;如果除法运算符左右的数中⾄少有⼀个是浮点数,则计算结果也是浮点数,此时除数可以为0或0.0,得到的结果是⽆穷⼤。
System.out.println(1.1/0);//Infinity
%:取余(取模)运算符
运算符左边减去运算符右边的数值。⽰例代码:
//10 % 3 == 1
System.out.println(10%1);//put 1
取余运算符得到结果不⼀定总是整数,如果取余运算符的左右两个数值都是整数,那么取余数(第⼆个数)不能为0;如果取余运算符左右的数中⾄少有⼀个是浮点数,此时第⼆个数可以为0或0.0,得到的结果是NaN(⾮数值)。
++/--:⾃加/⾃减运算符
++和--是单⽬运算符,只有⼀个操作数,它们⼜两种⽤法,以为++为例:
1. ⼀种是放在操作数的左边,表⽰先把操作数加1;
2. 另⼀种是放在操作数的右边,先运算其他语句,再把操作数加⼀。
概念还是不好理解,看⼀下⽰例代码:
//++测试
int n =1,m =1;
//++放在操作数左边
System.out.println(++n +1);//put 2 现在n==2
//++放在操作数右边
System.out.println(m+++1);//put 3 现在m==2
++/--运算符对于初学者很容易出错,这⾥需要结合⽰例好好了解⼀下。
++/--只能操作变量,不能操作常量或表达式等。
2.赋值运算符
赋值运算符⽤于为变量指定变量值。组合的赋值运算符就减少了代码量
=:赋值,如int a = 1;
+=: 对于a += b,等价于a = a + b;
-=: 对于a -= b,等价于a = a - b;
*=: 对于a *= b,等价于a = a * b;
/=: 对于a /= b,等价于a = a / b;
%=: 对于a %= b,等价于a = a % b;
&=: 对于a &= b,等价于a = a & b;
|=: 对于a |= b,等价于a = a | b;
^=: 对于a ^= b,等价于a = a ^ b;
<<=: 对于a <<= b,等价于a = a << b;
>>=: 对于a >>= b,等价于a = a >> b;
>>>=: 对于a >>>= b,等价于a = a >>> b;
3.位运算符
&:按位与。当两位同时为1时才返回1。
|:按位或。只要有⼀位为1就返回1。
~
:按位⾮。单⽬运算符,将操作数的每⼀位(包括符号位)全部取反。
^:按位异或。当两位不同时返回1,相同时返回0。
<<:左移运算符。
>>:右移运算符。
>>>:⽆符号右移运算符。
4.⽐较运算符
⽐较运算符⽤于判断两个常量或变量的⼤⼩,⽐较结果是⼀个布尔值(true或false)。
⽐较运算符有 :>(⼤于),>=(⼤于等于),<(⼩于),<=(⼩于等于),==(等于)。
5.逻辑运算符
逻辑运算符⽤于操作两个布尔的变量或常量,有如下6个:
&&:短路与,两个操作数都为true才返回true,否则返回false。
&:不短路与,作⽤与&&相同,但不会短路。
这⾥需要讲解⼀下 &和 && 的区别,两者都是左右都为true才返回true,⽽&在判断左边为false后会再去判断右边,&&判断左边为false后就直接返回false了,不会再去判断右边。|和||也是这⼀个但道理。
||:短路或,两个操作数只要有⼀个为true,就返回true,两个操作数都为false才返回false。
|:不短路或,作⽤与||相同,但不会短路。
!:⾮, 或取反,如果操作数是true,则返回false。如果是false,则返回true。
^:异或,当两个操作数不同时才返回true,相同返回false。
下⾯代码⽰范了逻辑运算符短路与不短路的区别(以&和&&的区别为例):
int n =1, m =1;
//不短路与左边为false还是会判断右边
if(false& n++>0){}
System.out.println(n);//put 2
//短路与左边为false就短路不在判断右边
if(false&& m++>0){}
System.out.println(m);//put 1
6.三⽬运算符
三⽬运算符? :,语法格式:(expression) ? if-true-statement : if-false-statement。先判断逻辑表达式expression,为true就返回if-true-statement,为false就返回if-true-statement。⽰例:
String n =2>1?"2⼤于1":"2不⼤于1";
System.out.println(str);//put  "2⼤于1"
三、运算符的优先级
可以使⽤括号()指定优先级。在不确定优先级的时候,按照⾃⼰指定的代码执⾏逻辑添加⼀个()是没有问题的,唯⼀的缺点就是代码看起来不美观… …
先看⼀下前辈的⼝诀:单⽬乘除位关系,逻辑三⽬后赋值。运算符号优先级由⾼到低:
运算符说明Java运算符
分隔符. [] () {} , ;
单⽬运算符++ – ~ !
强制类型转换运算符(type),如(int)运算符说明Java运算符
乘、除、取余* / %加、减+ -
移位运算符<<(左移) >>(右移) >>>(⽆符号左移)关系运算符< <= > >= instanceof
等价运算符==(等) !=(不等)
按位与&
按位异或^
按位或|
条件与&&
条件或||
三⽬运算符? :
赋值运算符= += -= *= /= &= |= ^= %= <<= >>= >>>=

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。