2.6 算术运算符与算术表达式
1.基本的算术运算符
● +:加法运算符或正值运算符,如4+7、+3。
● -:减法运算符或负值运算符,如4-7、-3。
● *:乘法运算符,如4*7。
● /:除法运算符,如4/7。
●%:模运算符,也称求余运算,要求%两侧均为整型数据,如7%4的值为3。
需要注意的是,当使用除法运算符“/”时,如果除数和被除数都是整型数据,则运算结果也是整型数据,例如7/3的结果是2,1/2的结果为0。如果参加运算的两个数据中有一个是实型数据,则运算结果是double型数据,因为所有实型数据都按double型数据进行运算,所以1./2的结果为0.5。
模运算符“%”的运算结果为两个整型运算对象做除法运算的余数。例如,7%3的结果为1。
使用运算符时,需要注意:
① 不允许两个算术运算符紧挨在一起,应该使用括号将其隔开。例如,x/-y应改为x/(-y)。
② 不能像数学算式那样省略乘号,也不能用圆点“· ”代替乘号。例如,(x-y)(x+y)或(x-y)·(x+y)是错误的,应改为(x-y)*(x+y)。
2.算术表达式
单个运算对象及用算术运算符和括号将运算对象连接起来的有意义的表达式都称为算术表达式。其中,运算对象包括常量、变量、函数等。例如,y、'c'、10、x1+y*z-a/23+'c'-100都是合法的算术表达式,其中,x1、y、z、a是已经定义的变量(已经声明了类型,并且完成了赋值),'c'是字符型常量,10、23、100是整型常量。
在将数学算式写成C语言表达式时,对于一些有具体值的符号,如圆周率π 等,要使用该符号所代表的值,或者先定义一个符号常量代替该值,再使用该符号常量;而对于一些没有具体值的符号,如α、β等,则要先定义一个标识符,再使用该标识符。
3.算术运算符的优先级与结合性
每个运算符都有自己的优先级和结合方向。如果一个运算对象的两边有不同的运算符,则先执行优先级高的。例如,乘、除的优先级就高于加、减的优先级。对于算术表达式,在优先级相同的情况下,按自左向右的顺序运算。使用括号可以改变运算顺序,需要注意的是,表达式中只能使用圆括号,如果有必要,可以使用嵌套的圆括号,如3.5*(2+x/(a+b))。
基本算术运算符的优先级(由高到低)如图2.10所示。
图2.10 基本算术运算符的优先级
其中,+(正值运算符)和-(负值运算符)只有一个运算对象,称为单目运算符,具有右结合性。*、/、%、+(加法运算符)和-(减法运算符)有两个运算对象,称为双目运算符,具有左结合性。
4.自增、自减运算符
“++”和“--”是自增、自减运算符,它们的功能是使一个变量的值加1或减1,它们都是单目运算符,而且其运算对象只能是整型变量或指针变量。
“++”和“--”既可以放在作为运算对象的变量之前,也可以放在变量之后。这样,就形成了4种表达式:i++、i--、++i、--i。前两个表达式是先使用i的值,然后再使i的值加、减1;后两个表达式是先使i的值加、减1,然后再使用变量i的值。例如:
int m1,n1,m2,n2; int i=1; int j=1; m1=i++; n1=i; m2=++j; n2=j;
该程序片段运行后,各变量的值为:m1=1,n1=2,m2=2,n2=2,i=2,j=2。
“++”和“--”的优先级较高,高于所有的算术运算符,并且具有右结合性。注意:“++”和“--”只能用于变量,不能用于常量或表达式。例如:
++10; (x+y)--;
都是错误的。
如果把“++”、“--”运算与其他运算符组合在一起构成表达式,就会比较让人费解,例如,表达式“a+++b--”代表什么含义呢?又是如何运算的呢?下面的程序演示了该表达式的运算结果:
#include <stdio.h> void main() { int a=3,b=5,c; c=a+++b--; printf("a=%d,b=%d,c=%d\n",a,b,c); }
因此,不建议读者这么做。