【0004】关于java中运算符优先级和运算符问题(详细版)

【0004】关于java中运算符优先级问题?(多个运算符出现是谁先算的问题)


知识点背景:


今天下午看一个表达式运算,发现运算顺序不是那么确定了,猜测答案也错了,,就是又忘了优先级,真服了,每次查找书又很麻烦,所以做个表格总结一下:


一、java中的运算符优先级(运算顺序)?


1.运算符优先级:(java核心技术书里面的哦)
运算符 结合性
[]   .()(方法调用) 从左向右
!    ; ~    ; ++    ; - -    ; +(一元运算符)    -(一元运算符)   ()(强制类型转换)    new 从右向左
*  /  % 从左向右
+  - 从左向右
<<    >>   >>>  从左向右
<  <=  >  >=  instanceof 从左向右
==   != 从左向右
& 从左向右
^ 从左向右
| 从左向右
&& 从左向右
|| 从左向右
? : 从右向左
=  +=  -=  *=  /=  %=  &=   |  ^=  <<=  >>=  >>>= 从右向左

java书上的没有对优先级123…顺序排序,但是可以看出是至上而下的运算符顺序(很符合当初学C语言的排序规则):

大概顺序为(以图片为主):初级(等)运算符> 单目 > 算数 > 关系 > 逻辑 >三目(条件) > 赋值

注意:1.逻辑运算符中不包括!运算符的,从图中可以看出!运算符位于第二行大于高于算数运算符优先级;2.java中不适用逗号运算符(区别于C语言)。


2.运算符有哪些主要的规则?
  1. 单目(一元)运算符(是指运算所需变量为一个的运算符,又叫一元运算符,)包括! ++ --,优先级高;
  2. 优先级别最低的是赋值运算符,初级优先级最高;同一级别的运算顺序从右向左结合性的(赋值运算符、三目运算符和单目运算符),其他的都是从左向右结合方向;
  3. 常用到的关系优先级:算术运算符(++)>关系运算符(>)>逻辑运算符(&&);
  4. 遇到不知道该怎么处理的运算符,就加()辅助,相当于把该运算符优先级提到最高,记得小学做算数有句话叫:有小括号先算小括号的
  5. 记忆口诀:单目乘除后关系,逻辑三目后赋值(优先级顺序,嘿嘿)。

运算符分类和各自特点:


写到这里其实写这篇博客的主要目的已经完成了,剩下点时间写一下常用的运算符其自定义与特点吧(都在上课笔记里面)!


按目数分类:

1.单目(一元)运算符:一次作用一个变量的运算符;
例如:++ --【自增自减运算符】、!【逻辑非运算符】、~(“not”)【按位取反运算符】、(类型)【类型转换运算符】、-【负号运算符】;


1.1自增自减运算符(++ --):将变量n的当前值加一或者减一

:n++++n、n----n

注意点:
1.操作数必须是变量,非数值,如:3++是错误的写法
2.表达式中当参与运算时候有所区别:++n先运算加一再进行其他操作(赋值),a++先进行其他操作(赋值),再运算加一;

例如:

int a=1int 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.常用于if条件中,进行多次判断,需要用到逻辑运算符&&或者||,不能连着写,例如1


2.3位运算符(&、|、^ 、~ ):处理整数类型时候,对组成整形数值的各个位完成操作(二进制),写到这让我想起了以前学习数字电路和模电的痛苦,哎,心疼学电路人几秒,嘿嘿,以后应该不会碰那玩意了吧(不确定),通过掩码技术得到各个位:&(“and”)、|(“or”)、^(“xor”)、~(“not”);

 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位)。


2.4逻辑运算符:&&(和,并且) 、||(或)和!(取反 )单目运算符 :他们结果只能用于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

2.&&和||至少左右需要有一个boolean值,但是!(取反)是单目运算符只要有一个boolean值即可。


2.5赋值运算符(= += -= *= /= %= &= | ^= <<= >>= >>>=):该运算符可用来将算术运算符,位运算符与赋值结合起来,从而提高代码的运行效率,简化表达式,节约代码量的作用;

注意点:复合的赋值运算符具有强制类型转化的特点;

int a=1; int b+=a;//相当于int b=(int)(b+a);

3.三目(三元、条件)运算符(?:):一次作用三个变量的运算符;
格式:

条件表达式?值1:值2(条件表达式?True:False)
1>2?111:222;//结果为:222

这篇博客有有关于对三目运算符及其嵌套有详细举例解释,想了解的可以看一下:

https://blog.csdn.net/Caojian_0/article/details/125434772

你可能感兴趣的:(运算符,优先级,java)