运算符的优先级与结合律

< 上一页 运算符大全 表达式与求值 下一页 >

C语言中,每一种运算符有自己的优先级,还有对应的结合律,每个运算符的优先级和结合律请见上表:表中同一行的运算符优先级相同,并大于下面的运算符,从表中可以看出运算符的优先级,而结合律分为两种:从左到右结合或者从右到左结合,其中大部分是从左到右结合,只有一目运算符,?:运算符,符合运算符如+=,赋值运算符=,以及逗号运算符,是从右往左运算符,剩余的都是从左到右运算符。

由多个运算符与变量或常量组成的式子叫做符合表达式(表达式的进一步介绍请参考第六章)。每个表达式都会有一个值。复合表达式的值由操作数的结合方式决定。而运算符的优先级和结合律就确立了操作数的结合方式。其中的原则为:

当复合表达式中的运算符的优先级不同时,操作数的结合方式由优先级决定。操作数总是围绕优先级较高的运算符进行结合;当复合表达式中的运算符的优先级相同时,操作数的结合方式由结合律决定。

比如, 乘法运算符(*)的优先级高于加法(+)的优先级,那么对于下面的复合表达式:

5+4*3

不可能是54先结合,然后再和3结合,而是43先结合,完成乘法运算,然后再和5完成加法运算,因此它的值是:17

而当复合表达式中的所有运算符相同时,比如下面的复合表达式:

1+2+3+4

由于加法运算符的结合律是从左到右,因此,12先结合,结果再和3结合,结果再和4结合,计算结果为:10。再看一个复合表达式:

1+ 8/ 2 *4

该复合表达式中,除法和乘法的优先级相同,而且结合律都是从左往右(即从左往右结合),于是先是82结合做除法运算,计算结果为4,再和4结合,计算结果为16,再和1结合,做加法运算,最终的值为17

此外,也可以利用括号运算符来强制更改复合表达式的结合方式。比如,对于下面的表达式:

3+5*4

如果想先要让35结合,做加法运算,然后再和4结合做乘法运算,可以加上括号如下:

(3+5)*4

这样符合表达式的结合律就改成了希望的35先结合,再和4结合了。计算的结果就是32

 

记忆不能死记,即使通过死记记住了,那也是短期记忆,长久之后也记不住,因此需要讲究特别的技巧。下表用三句话记住所有运算符的优先级:

口诀

解释

扩建点

(扩建新的地点)

扩(大、中、小括号)建(->符号)点(.符号)

单算易比较

(单独计算容易比较)

单(单目运算符)算(算术运算符)易(移位运算符)比较(比较运算符)

胃饥三等点

(胃很饥饿,等到3点多)

胃(位运算符)饥(逻辑运算符)三(三目运算符)等(赋值运算符,+=、-=等缩写运算符)点(逗点运算符)


结合律的记忆,则可以考虑记住右结合律的运算符,这部分运算符比较少,只有4类,即:
一元运算符和三元运算符都是右结合律;赋值(=)运算符和逗号(,)运算符是右结合律,剩下的就是左结合律。
< 上一页 运算符大全 表达式与求值 下一页 >

周哥教IT,分享编程知识,提高编程技能,程序员的充电站。跟着周哥一起学习,每天都有进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

当你决定关注「周哥教IT」,你已然超越了90%的程序员!

IT黄埔-周哥教IT技术交流QQ群:213774841,期待您的加入!

二维码
微信扫描二维码关注