4.3 算术运算符与算术表达式
4.3.1 算术运算符
在现实生活中常常遇到各种各样的计算问题。例如,某超市老板每天需要计算本日的销售金额,需要将每种产品的销售额相加,此处的“相加”就是数学运算符中的“+”,“+”在C语言中称为算术运算符。
算术运算符包括2个单目算术运算符(正运算符和负运算符)和5个双目算术运算符(乘法运算符、除法运算符、取模运算符、加法运算符、减法运算符),如表4.1所示。
表4.1 算术运算符
在表4.1中,取模运算符“%”的两侧均为整数,该运算符主要用于计算两个整数相除得到的余数,如7%4的结果是3。
学习笔记
单目正运算符是冗余的,它是为了与单目负运算符形成对比而存在的。单目正运算符不会改变任何数值,如不会将一个负值表达式的值改为正值。
学习笔记
运算符“-”可作为单目负运算符,如-5;“-”也可作为减法运算符,此时为双目运算符,如5-3。
4.3.2 算术表达式
如果表达式中的运算符都是算术运算符,则将该表达式称为算术表达式。以下表达式中的运算符都是算术运算符,它们都是算术表达式。
需要说明的是,两个整数相除的结果为整数,如7/4的结果为1,舍去的是小数部分。但是,当其中的一个数是负数时会出现什么情况呢?此时机器会采取“向零取整”的方法,如-7/4的结果为-1,在取整后向0靠拢。
学习笔记
如果使用“+”“-”“*”“/”进行运算的两个数中有一个为实数(包含float、double、long double共3种数据类型),那么结果是double型数据,因为所有实数都按double型数据进行运算。
4.3.3 算术运算符的优先级与结合性
C语言中规定了各种运算符的优先级与结合性。
1.算术运算符的优先级
在算术表达式求值时,会按照运算符的优先级的高低次序进行运算。在算术运算符中,单目正运算符和单目负运算符的优先级最高;在双目运算符中,乘法运算符、除法运算符和取模运算符比加法运算符、减法运算符的优先级高。如果在表达式中同时出现“*”和“+”,那么先进行乘法运算,再进行加法运算。例如:
在上述表达式中,因为“*”比“+”的优先级高,所以先进行y*z的运算,再加上x。
学习笔记
在算术表达式中,如果要先计算a+b,再将结果与c相乘,那么可以使用小括号“()”将a+b括起来,因为小括号“()”在运算符中的优先级是最高的。因此这个算术表达式应该写成 (a+b)*c。
2.算术运算符的结合性
当算术运算符的优先级相同时,结合性为自左向右。例如:
因为“-”和“+”的优先级是相同的,所以先进行a-b的运算,再加上c。
4.3.4 自增/自减运算符
C语言中有两个特殊的运算符,即自增运算符“++”和自减运算符“--”。自增运算符的作用是使变量值增加1。例如,在公交车上,每上来一位乘客,乘客就会增加一位,此时的乘客数量就可以使用自增运算符进行计算。自减运算符的作用是使变量值减少1。例如,客车的座位,每上来一位乘客,客车的座位就会减少一个,此时的座位数量就可以使用自减运算符进行计算。
自增运算符和自减运算符可以放在变量前面,称为前缀;也可以放在变量后面,称为后缀。使用自增运算符的算术表达式和使用自减运算符的算术表达式的语法格式及计算结果如图4.9所示。
图4.9 使用自增运算符的算术表达式和使用自减运算符的算术表达式的语法格式及计算结果
根据图4.9可知,将自增运算符或自减运算符放在变量的前面和后面所得到的结果是一样的。使用自增运算符的结果是在变量原值的基础上加1,使用自减运算符的结果是在变量原值的基础上减1。
学习笔记
在表达式内部,作为运算的一部分,自增运算符和自减运算符的用法可能有所不同。如果将自增运算符或自减运算符放在变量前面,那么该变量会先进行自增或自减运算,再进行其他运算;如果将自增运算符或自减运算符放在变量后面,那么该变量会先进行其他运算,再进行自增或自减运算。以自增运算符为例,自增运算符在变量前面和变量后面的效果对比如图4.10所示。
图4.10 自增运算符在变量前面和变量后面的效果对比
学习笔记
自增运算符和自减运算符都是单目运算符,因此常量和表达式不可以使用这两个运算符,如5++和(a+5)++都是不合法的。