2.7 算术运算符和算术表达式

C语言的运算符可以分为算术运算符、关系运算符、逻辑运算符、赋值运算符、条件运算符和逗号运算符6类,本节主要介绍算术运算符及其表达式,其他类型的运算符将在后面的章节中陆续介绍。

2.7.1 算术运算符

学习提示

【理解】算术运算符的优先级与结合性

算术运算符主要用于各类数值运算。本小节将从运算符的种类、优先级和结合性3个方面介绍算术运算符的特点和使用方法。

1 算术运算符的分类

按照算术运算符的性质,可以将算术运算符分为加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)7种。按照参与运算的运算数的个数,可以将算术运算符分为单目运算符和双目运算符。算术运算符的分类如表2-4所示。

表2-4 算术运算符的分类

其中+(加法运算符)、*、/(乘、除法运算符)和%(模运算符)都是双目运算符,即它们在参与运算时,左右各需要一个运算数。而-(减法运算符)既是双目运算符,又是单目运行符,当作为双目运算符时表示两个数的差;作为单目运行符时,只需要后跟一个运算对象,表示取它的负值。自增(++)、自减(--)也是单目运算符,在后面的章节中将详细介绍 。

说明

符号“*”表示乘法,在C语言中不能用数学中习惯的“×”或“·”号表示乘,也不能省略,如2*y不能写作2y。

符号“/”表示除法,需要说明的是,两个整数相除的结果为整数,如5/2结果为2,舍去小数部分。但是,如果除数或被除数中有一个为负值,则舍入的方向是“向零取整”,即5/2为2,-5/2或5/-2的结果为-2。

符号“%”表示求模运算,要求两侧的操作数均为整型数据,即两个数相除的余数的运算结果也是整数,如“5%2”的结果为1。

2 算术运算符的优先级和结合性

C语言规定了运算符的优先级与结合性。在对表达式求值时,先按运算符的优先级别高低次序执行,如果一个运算对象两侧的运算符的优先级别相同,则按规定的“结合方向”处理。

通常,算术运算符的优先级是取负值运算符>乘除运算符>加减运算符。这里需要特别指出的是,圆括号可用来改变优先级,也就是说圆括号的运算级别最高。

例如

1+2*3的运算结果是7,(1+2)*3的运算结果是9。

圆括号的这种特性不仅适用于算术运算符,而且对其他的运算符也是适用的。所以,在使用C语言的时候,可以灵活运用圆括号来得到想要的优先级顺序。

所谓结合性是指当一个操作对象两侧的运算符具有相同的优先级时,该操作对象是先与左边的运算符结合,还是先与右边的运算符结合。C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。

左结合性是指某一个运算对象先与左边的运算符相结合,再将运算结果与右边的运算符相结合。同理,我们可以知道右结合性的结合方向。

例如

表达式“x-y+z”的计算顺序是:y应先与“-”号结合,执行“x-y”运算,然后再执行“+z”的运算。

例如

x=y=z ;

说明

由于“=”具有右结合性,可以先执行y=z运算,再执行x=(y=z)运算。C语言运算符中有不少具有右结合性,应注意区别,以避免理解错误。

请注意

结合性是C语言所独有的概念。除单目运算符、赋值运算符和条件运算符是右结合性外,其他运算都是左结合性。

2.7.2 算术表达式

学习提示

【理解】算术运算符的优先级与结合性

用算术运算符和圆括号将运算对象(常量、变量和函数等)连接起来的符合 C语言语法规则的式子称为算术表达式。算术表达式有3个要素,分别是运算对象(常量、变量、函数等)、圆括号和算术运算符。

一个常量、一个变量(已被赋值)都是合法的表达式,如1、0、x等。简单的表达式还可以加上圆括号,或者与运算符进行连接构成新的表达式。

例如

-x、1+x、(-x)、(1+x)都是合法的算术表达式,(-x)*(1+x)又构成了新的表达式 。

说明

C语言表达式中的所有标识符必须写在一行,没有分式,也没有上下标,如数学表达式:

需要写成(a+b)/(c+d),这里括号是不可缺少的。如果没有括号,实际上就变成了a+(b/c)+d。

了解了算术运算符的优先级和结合方向以后,再来分析一下表达式-x*(-y+4)/a-1的求值过程。

(1)求表达式“-x”的值。

(2)求表达式“-y”的值。

(3)求表达式“-y+4”的值。

(4)求表达式“(1)”乘“(3)”的值。

(5)求“(4)/a”的值。

(6)求“(5)-1”的值。

从这个小例子可以看出,C表达式的本质是一个值。因此,表达式可以出现在数值能够出现的任何地方,这也意味着,如果表达式中有变量,则变量在被引用之前必须已被赋值。

真题演练

【例1】若有定义语句:int a=12;,则执行语句:a+=a-=a*a;后,a的值是( )。

A)-264  B)552  C)144  D)264

【解析】赋值运算结合性为自右向左,语句a+=a-=a*a相当于a=a-a*a,a=a+a;,自右向左计算过程为a=a-a*a=-132,a=a+a=-264,选项A正确。

【答案】A

【例2】有C语言表达式2*3+4+15%3,关于其执行顺序,以下叙述中正确的是( )。

A)先执行2*3得6,再执行6+4得10,再执行15%3得0,最后执行10+0得10

B)先执行2*3得6,再执行15%3得5,最后执行6+4+5得15

C)先执行15%3得0,再执行2*3得6,最后执行6+4+0得10

D)先执行15%3得3,再执行4+3得7,再执行2*3得6,最后执行6+7得13

【解析】运算符“*”和运算符“%”有相同优先级,并且优先级都高于运算符“+”,再根据运算结合性,乘法和取余运算都满足从左到右的运算规则,故选项C、D错误;因为15%3=0,故排除选项B,答案为选项A。

【答案】A