10天能写一篇技术文章吗? | 深入理解所有运算符的结合性质
前言:我是因为看不懂这一段代码的执行顺序,所以写一篇运算符结合顺序的文章。

A.基础知识
0.基础定调:所有的同一级运算符按照从左到右的结合顺序。
以下所有运算符按照升序排列。
1.结合运算符优先级排行倒数第一:
感性的来说,运算符按照从左到右的结合顺序。
有一个例外,因为等号的特殊性,所以右边有等号的右运算符是右结合性的,就是右运算符需要按照从右到左。
包括:= += -= *= /= %= &= |= ^= <<= >>= >>>=,包含赋值运算符,加等,减等,乘等,除等,与等,或等,异或等,左移等,右移等,无符号右移等。
2.三目运算优先级排行倒数第二:
唯一的三目运算符,因为包含三个操作数,所以叫三目运算符,即表达式?成立选择:不成立选择,结合性为从右到左,也就是先算右边的,在算左边的。
3.短路或优先级排行倒数第三:
||短路或运算结合性是从左到右,也就是说先看左边表达式成立不。
4.短路与优先级排行倒数第四:
&&短路与运算结合性是从左到右的,也就是说先看左边表达成立不。
5.或运算优先级排行倒数第五:
|或运算结合性是从左到右的,也就是说左边或运算右边的,而不是读作右边的或运算左边的。
6.异或运算优先级排行倒数第六:
^运算结合性是从左到右的,也就是说左边异或运算右边的。
7.与运算优先级排行倒数第七:
&运算结合性是从左到右的,也就是说左边的与运算右边的。
8.是否等于运算优先级排行倒数第八:
== 和 !=是运算结合性是从左到右的,也就是判断左边是否等于右边,而不是判断右边是否等于左边,但显然这是相同的读法。
9.判断大小运算优先级排行倒数第九:
所有判断大小的结合性都是从左到右。
<读作左边是否小于右边的,不可读作是否右边的大于左边的,虽然效果是一样的。
<=读作左边的是否小于等于右边的。
>读作左边的是否大于左边的。
>=读作左边的是否大于等于右边的。
instanceof读作它左边的对象是否是它右边的类的实例,同样是从左边结合到右边,得到true或false
10.移位运算优先级排行倒数第十:
<<
>>
>>>
11.加减运算优先级排行倒数第十一
+加号结合性是从左到右,也就是说用左边的加上右边的,不能读作把右边的加上左边的,虽然效果是一样的。
-减号结合性是从左到右,也就是说用左边的减去右边的,不能读作把右边的减去左边的,这当然不一样。
12.乘除取模运算优先级排行倒数第十二
*运算结合性是从左到右,也就是说用左边的乘右边的值,当然左右相乘是一样的,可推出结合交换性。
/运算结合性是从左到右,也就是说用左边的除右边的,不能读作右边的除左边的。
%运算结合性是从左到右,也就是说左边的对右边的取模运算,不能读作右边的对左边的取模运算。
13.new新建对象和强制转换排行倒数第十三
!运算结合性是从右到左,逻辑非读作右边的操作数是true,那么右边运算后是false。
~运算结合性是从右到左,读作右边取反码。
++运算结合性是从右到左,读作从右边开始加,而不是将左边开始加。
--运算结合性是从右到左,读作从右边开始减,而不是将左边开始减。
new的结合性是从右到左,用右边新建一个类型的对象。
强制转换类型的括号:()的结合性是从右到左,用右边的强制转换成括号中的类型。
15.方法调用排行倒数第十四
方法调用的括号:[].()都是从左到右,用左边的对象使用右边的方法得到结果。
记忆方法:
单目运算符> 算术运算符 > 位移运算符 > 关系运算符 > 逻辑运算符 > 三目运算符 > 赋值运算符
算术运算符内按照基本数学规则划分;
位移运算符
B.为了加深理解,把下面加上括号表现出运算的优先级:
a && b || c 等效于:( a && b ) || b
a += b += c 等效于:a += ( b += c )
C.是否能理解图片中的代码?解析一下:
{
String str = txtAnswer.getText();
//优先级从方法调用排第一,赋值排第二,然后结合性是从做左到右,txtAnswer调用GetText()方法,返回结果是一个字符串, 然后等号的结合性是从右到左,即得到的结果赋值给str。
double d = Double.valueOf(str).doubleValue();
//根据优先级,先找优先级最高的,点是访问方法的意思,中括号是表示带变量的访问方法,因为()和.的优先级相同,Double是一个类,类里面定义了成员变量和成员函数,从左边str去访问函数valueOf,然后再访问doubleValue()方法。得到一个double类型结果,根据优先级,赋值在最后,最后把结果给d,double代表显式说明他的类型。
String disp = "" + a + op + b + "=" + str + " ";
//快速判断,优先级最高的是+字符串连接,结合性从右到左,所以依次是连接字符串,最后赋值运算优先级排最后,给disp,String表示显式的说明类型。
if( d == result)
disp += "√" ;
//根据运算优先级,括号内优先级最高,==是从左到右,d如果与result相等,那么进行后面的语句,后面则是混合赋值符,结合性是从右到左,把右边的操作数连接到左边。
else disp += "x";
//否则,就把右边的叉连接到左边。
listDisp.add( disp );
//括号和点优先级相同,按照同级优先级从左边到右边,类listDisp的成员函数add,参数为disp。
}
资料链接:
1.https://www.javatpoint.com/java-operator-precedence
2.https://www.php.cn/java-article-421445.html
3.https://huongdanjava.com/priority-of-operators-in-java.html

浙公网安备 33010602011771号