【0004】关于java中运算符优先级问题?(多个运算符出现是谁先算的问题)
今天下午看一个表达式运算,发现运算顺序不是那么确定了,猜测答案也错了,,就是又忘了优先级,真服了,每次查找书又很麻烦,所以做个表格总结一下:
运算符 | 结合性 |
---|---|
[] .()(方法调用) | 从左向右 |
! ; ~ ; ++ ; - - ; +(一元运算符) -(一元运算符) ()(强制类型转换) new | 从右向左 |
* / % | 从左向右 |
+ - | 从左向右 |
<< >> >>> | 从左向右 |
< <= > >= instanceof | 从左向右 |
== != | 从左向右 |
& | 从左向右 |
^ | 从左向右 |
| | 从左向右 |
&& | 从左向右 |
|| | 从左向右 |
? : | 从右向左 |
= += -= *= /= %= &= | ^= <<= >>= >>>= | 从右向左 |
java书上的没有对优先级123…顺序排序,但是可以看出是至上而下的运算符顺序(很符合当初学C语言的排序规则):
大概顺序为(以图片为主):初级(等)运算符> 单目 > 算数 > 关系 > 逻辑 >三目(条件) > 赋值
注意:1.逻辑运算符中不包括!运算符的,从图中可以看出!运算符位于第二行大于高于算数运算符优先级;2.java中不适用逗号运算符(区别于C语言)。
写到这里其实写这篇博客的主要目的已经完成了,剩下点时间写一下常用的运算符其自定义与特点吧(都在上课笔记里面)!
1.单目(一元)运算符:一次作用一个变量的运算符;
例如:++ --【自增自减运算符】、!【逻辑非运算符】、~(“not”)【按位取反运算符】、(类型)【类型转换运算符】、-【负号运算符】;
1.1自增自减运算符(++ --):将变量n的当前值加一或者减一
如:n++、++n、n--、--n
注意点:
1.操作数必须是变量,非数值,如:3++是错误的写法
2.表达式中当参与运算时候有所区别:++n先运算加一再进行其他操作(赋值),a++先进行其他操作(赋值),再运算加一;
例如:
int a=1;int b=++a; int c=a++;//b=2,c=1,
2.双目(二元)运算符:一次作用两个变量的运算符,;
例如:
初等运算符:[ ]【下标】、.()【方法调用】;
算术运算符:* / % + - ;
关系运算符:==、!=、>、 < 、<= 、>= ;
位运算符:&【与】、|【或】、^【异或】;>>【右移】 <<【左移】
逻辑运算符:&& 、|| !(单目的);
赋值运算符= += -= *= /= %= &= |= ^= <<= >>= >>>=;
2.1算术运算符(* / % + -):字面意思进行加、减、乘、除,取余的算术运算,和小学数学一样哈;
int a=1, b=2; int c1=a*b;int c2=a+b;
注意点:
1.运算数必须是数字类型。不能用在布尔类型上,但是可以用在char类型上(java中char,short和byte类型是int类型的一个子集);
2.值得注意的是减运算也用作表示单个操作数的负号;
3.【/】除法运算时,所有的余数都要被舍去,【%】取模运算时只取余数;
4.实践小技巧:a*(1.0/b)可以取得带余数的值
5.模运算符%能像整数类型一样被用于浮点类型,区别于C语言;
2.2关系运算符(==、!=、>、 < 、<= 、>= ;):两个数据之间进行比较的运算,运算结果成立就是true,不成立就是false,返回结果一定是一个boolean值。
int a=1,b=2;System.out.println(a==b);//false
1.对于基本类型,==比较的是值,对于引用类型,==比较的是地址,其常常与equals做比较用来作为面试题被提到; 2.3位运算符(&、|、^ 、~ ):处理整数类型时候,对组成整形数值的各个位完成操作(二进制),写到这让我想起了以前学习数字电路和模电的痛苦,哎,心疼学电路人几秒,嘿嘿,以后应该不会碰那玩意了吧(不确定),通过掩码技术得到各个位:&(“and”)、|(“or”)、^(“xor”)、~(“not”); 注意点: 2.4逻辑运算符:&&(和,并且) 、||(或)和!(取反 ) 对于逻辑或运算符来说,若第一个表达式为真则结果为真,此时跳过第二个表达式; 2.&&和||至少左右需要有一个boolean值,但是!(取反)是单目运算符只要有一个boolean值即可。 2.5赋值运算符(= += -= *= /= %= &= | ^= <<= >>= >>>=):该运算符可用来将算术运算符,位运算符与赋值结合起来,从而提高代码的运行效率,简化表达式,节约代码量的作用; 注意点:复合的赋值运算符具有强制类型转化的特点; 3.三目(三元、条件)运算符(?:):一次作用三个变量的运算符; 这篇博客有有关于对三目运算符及其嵌套有详细举例解释,想了解的可以看一下: https://blog.csdn.net/Caojian_0/article/details/125434772
2.常用于if条件中,进行多次判断,需要用到逻辑运算符&&或者||,不能连着写,例如1
int a = 111;int b=(a&0b100/0b100);//1
int c=(a&(1<<3)>>3);//1
1.位运算符应用在布尔值上是沒具有短路效果,无论左边是否能够判断最终结果都需要执行完毕才能结束(底下会与逻辑运算符详细介绍);
2.>>>会用0填充高位,区别于>>,它会用符号位填充高位,且不存在<<<运算符;
3.java中的>>移动位运算消除了关于位运算完成的是算数(扩展符号位)还是逻辑移位(填充0)的不确定性,区别于C语言,更加高效,并且<<操作数一般完成模32位的运算(除左操作数为long类型,右操作数要完成64位)。
单目运算符 :他们结果只能用于boolean类型的值,常常与比较运算符连用;
具体情况:
1.&& 全都是true才是true,否则是false;
2.|| 有一个是true就是true;全都是false才是false;
3. !原来是true,变成false;即非真即假;
注意点:
1.&&和||,具有短路效果,如果左边已经可以判断得到最终结果,那么右边的代码将不再执行;位运算符&和|与其很相似,但是嘞沒具有短路效果,无论左边是否能够判断最终结果都需要执行完毕才能结束;
短路效果:(右边表达式是否执行、有没有必要执行):
对于逻辑与运算符来说,若第一个表达式为假则结果为假,此时跳过第二个表达式;(反正都会是假的,就不打算执行第二个表达式的思想) int a=1;System.out.println(a!=1&&a++>1);//1
例如:int a=1;System.out.println(a==1||a++>1);//1
int a=1; int b+=a;//相当于int b=(int)(b+a);
格式:条件表达式?值1:值2(条件表达式?True:False)
1>2?111:222;//结果为:222