本节书摘来自华章社区《C语言程序设计:问题与求解方法》一书中的第2章,第2.15节算术表达式,作者:何 勤,更多章节内容可以访问云栖社区“华章社区”公众号查看
2.15 算术表达式
所谓算术表达式是用一个或多个算术运算符将运算量(包括常量、变量、函数调用)连接起来的,可以计算出明确值的式子。比如,b b – 4 a c、 ab*sin(alfa)/2.0就是算术表达式。
算术表达式是用得最多的一种表达式,在完成计算一个数值的工作时通常要使用它。
如果算术表达式中有两个以上算术运算符,各运算符按照什么先后顺序进行运算?这要分以下三种情况来讨论:
1)由运算符固有的优先级来确定。
在C语言的全部算术运算符中,取负数(–)这个一元运算符优先级最高;*、/、%这些运算符的优先级其次;+、–运算符的优先级最低。
也就是说,C语言中的算术表达式中的运算顺序,除增加了一个与乘除运算优先级同样的取模运算符%之外,还是完全遵守我们熟悉的“先乘除、后加减”的运算顺序。比如,对于3.7+4.1*–12.0,先做取负数运算–12.0,再做乘法运算得到–49.2,最后再做加法运算,得到–45.5。
2)在一个算术表达式中,如果出现了多个同一优先级的二元算术运算符,则是按从左到右的顺序进行运算的。 比如,对于45/2% 63,因为该式中从左到右依次出现的算术运算符、%、/都是同一优先级的 ,所以它的运算是从左到右依次进行的。
提示:运算符的“结合性”
所谓运算符的“结合性”其实指的是运算符与运算量的结合,是对出现在表达式中的具有同一优先级的连续多个运算符而言的,用来规定这些运算符之间与运算量的先后结合次序。先与运算符结合的运算量(构成了一个子表达式)先进行运算。
可以说,二元算术运算符的结合性是从左到右的。在下一章将看到,有一些运算符的结合性是从右到左的(比如赋值运算符)。
3)如果以上两种方式构成的算术表达式都不能满足对运算顺序的要求,则可以使用圆括号来改变运算符固有的运算顺序。比如,我们想求三个变量之和的平均值,不能用n1+n2+n3/3.0来表示,而必须加上圆括号(n1 + n2 + n3)/3.0。
在C语言中,可以使用圆括号括住表达式中的一个子表达式,用来强制改变运算符固有的运算次序。比如,(3.7+4.1)12.1,那就是要先做子表达式3.7+4.1 的加法运算,然后再用子表达式得到的运算结果7.8再做乘法运算:7.812.1 。
但是,在C语言中,千万不能用中小学学过的方括号“[”、“]”和花括号“{”、“}”来表示要优先进行运算的(子表达式)部分。因此,以下式子在C语言中是错误的:
2.3-{b*[y-(3.7+b)] }/6.3
这种情况下,应当用多重圆括号()来取代 []和{}。正确的表达式应当是:
2.3-(b*(y-(3.7+b)))/6.3
在表达式中,可以使用多重嵌套的圆括号来强制改变运算符的固有的优先次序,运算顺序由内到外。在以上表达式中,最先做的是 3.7+b这个子表达式的运算,然后依次做外层括号的运算。
在编程时,若不记得表达式中运算符的优先级,最省事的办法不是去查看运算符的优先级表,而是直接在表达式中添加圆括号。适当增加“多余的”圆括号,将使得表达式中的先后运算顺序更清楚。