
5.13 运算符之间的优先次序以及括号的用法
如果表达式里面有两个或两个以上的运算符,那么一定要弄清楚这些运算之间的执行次序。这种顺序又称为求值顺序(order of evaluation)。并非所有表达式都按照从左至右的方向来执行这些运算。
考虑3+4*5这个式子。如果先算加法,后算乘法,那要先算出3+4的结果,并把这个结果(也就是7)与5相乘,得出35。如果先算乘法,后算加法,那么要先算出4*5的结果,并让3与这个结果(也就是20)相加,得出23。
如果不太确定运算符之间的默认次序,那么可以通过括号来消除疑虑。依旧以此算式为例,如果要表达前一种意思,那么就把3+4这一部分括起来,写成(3+4)*5,如果要表达后一种意思,那么就把4*5这一部分括起来,写成3+(4*5)。
C语言会用一套涉及优先次序与结合方向的规则来决定算式中的各项运算应该按照什么顺序执行。其中,优先次序指的是哪种操作先执行,哪种操作后执行,结合方向指的是优先次序相同的多项操作之间应该从左往右结合,还是应该从右往左结合。
下面这张表格涵盖了我们已经遇到的所有运算符,以及目前还没有遇到的一些运算符,例如后缀运算符里面的[]、.、->以及一元运算符里面的*、&,这些运算符会在后面的章节中讲解。表格第一行的后缀运算符优先次序最高,表格最后一行的序列运算符优先次序最低。


这里有两个地方值得注意:第一,用括号括起来的部分总是优先运算;第二,语句中的赋值操作一般放在最后执行。当然,严格来说,还有比赋值运算符的优先次序更低的运算符,也就是序列运算符(逗号运算符),但是这种运算符在普通语句里面用得不多。它主要用在for这样的复杂语句中,我们会在第7章讲解这个话题。
运算符之间的优先次序与结合方向是相当重要的,然而笔者还是建议大家在表达式里面通过括号明确指出自己想要先算哪一部分,因为这样更加清晰,不会引发歧义。后续章节会讲解其他一些运算符,到时我们会回过头来再观察这张表格。