运算符的优先级与结合律
在C语言中,每一种运算符有自己的优先级,还有对应的结合律,每个运算符的优先级和结合律请见上表:表中同一行的运算符优先级相同,并大于下面的运算符,从表中可以看出运算符的优先级,而结合律分为两种:从左到右结合或者从右到左结合,其中大部分是从左到右结合,只有一目运算符,?:运算符,符合运算符如+=,赋值运算符=,以及逗号运算符,是从右往左运算符,剩余的都是从左到右运算符。
由多个运算符与变量或常量组成的式子叫做符合表达式(表达式的进一步介绍请参考第六章)。每个表达式都会有一个值。复合表达式的值由操作数的结合方式决定。而运算符的优先级和结合律就确立了操作数的结合方式。其中的原则为:
当复合表达式中的运算符的优先级不同时,操作数的结合方式由优先级决定。操作数总是围绕优先级较高的运算符进行结合;当复合表达式中的运算符的优先级相同时,操作数的结合方式由结合律决定。
比如, 乘法运算符(*)的优先级高于加法(+)的优先级,那么对于下面的复合表达式:
5+4*3
不可能是5和4先结合,然后再和3结合,而是4和3先结合,完成乘法运算,然后再和5完成加法运算,因此它的值是:17。
而当复合表达式中的所有运算符相同时,比如下面的复合表达式:
1+2+3+4
由于加法运算符的结合律是从左到右,因此,1和2先结合,结果再和3结合,结果再和4结合,计算结果为:10。再看一个复合表达式:
1+ 8/ 2 *4
该复合表达式中,除法和乘法的优先级相同,而且结合律都是从左往右(即从左往右结合),于是先是8和2结合做除法运算,计算结果为4,再和4结合,计算结果为16,再和1结合,做加法运算,最终的值为17。
此外,也可以利用括号运算符来强制更改复合表达式的结合方式。比如,对于下面的表达式:
3+5*4
如果想先要让3和5结合,做加法运算,然后再和4结合做乘法运算,可以加上括号如下:
(3+5)*4
这样符合表达式的结合律就改成了希望的3和5先结合,再和4结合了。计算的结果就是32。
口诀 |
解释 |
扩建点
(扩建新的地点) |
扩(大、中、小括号)建(->符号)点(.符号) |
单算易比较
(单独计算容易比较) |
单(单目运算符)算(算术运算符)易(移位运算符)比较(比较运算符) |
胃饥三等点
(胃很饥饿,等到3点多) |
胃(位运算符)饥(逻辑运算符)三(三目运算符)等(赋值运算符,+=、-=等缩写运算符)点(逗点运算符) |
结合律的记忆,则可以考虑记住右结合律的运算符,这部分运算符比较少,只有4类,即:
一元运算符和三元运算符都是右结合律;赋值(=)运算符和逗号(,)运算符是右结合律,剩下的就是左结合律。