C语言中运算符和表达式数量之多,在高级语言中是少见的。正是丰富的运算符和表达式使C语言功能十分完善。这也是C语言的主要特点之一。
C语言的运算符不仅具有不同的优先级,而且还有一个特点,就是它的结合性。在表达式中,各运算量参与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的制约,以便确定是自左向右进行运算还是自右向左进行运算。这种结合性是其他高级语言的运算符所没有的,因此也增加了C语言的复杂性。
3.2.2.1 C运算符简介
C语言的运算符可分为以下几类:
1)算术运算符:用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共7种。
2)关系运算符:用于比较运算。包括大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)和不等于(!=)共6种。
3)逻辑运算符:用于逻辑运算。包括与(&&)、或(||)、非(!)共3种。
4)位操作运算符:参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)共6种。
5)赋值运算符:用于赋值运算。分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共11种。
6)条件运算符:这是一个三目运算符,用于条件求值(?:)。
7)逗号运算符:用于把若干表达式组合成一个表达式(,)。
9)求字节数运算符:用于计算数据类型所占的字节数(sizeof)。
10)特殊运算符:有括号(),下标[],成员(→,.)等几种。
3.2.2.2 算术运算符和算术表达式
1.基本的算术运算符
1)加法运算符“+”:如a+b
2)减法运算符/负数值符号“-”:如a-b或负数-5
3)乘法运算符“*”:如a*b
4)除法运算符“/”:如a/b
5)求余运算符(模运算符)“%”:如11%3=2,即11除以3后,余数为2。
【例3-10】
本例输出110除以3所得的余数2。
2.算术表达式和运算符的优先级和结合性
算术表达式——用算术运算符和括号将运算对象连接起来的,符合C语言语法的式子,我们称为算术表达式。其运算对象包括常量、变量、函数等。表达式求值运算按运算符的优先级和结合性来进行。
以下是算术表达式的例子:
1)运算符的优先级:优先级——当一个运算对象两边都有运算符时,执行运算的先后顺序。优先级高的,则先进行运算。C语言中,运算符的运算优先级总共分为15个等级。1级最高,15级最低。在表达式中,优先级较高的比优先级较低的先进行运算。而在一个运算对象两侧的运算符优先级相同时,那就得按运算符的结合性规定进行处理。
2)运算符的结合性:结合性——当一个运算对象两边的运算符出现相等优先级情况下的运算顺序。C语言中所有运算符的结合性分为两种,左结合性(自左向右)和右结合性(自右向左)。算术运算符的结合性是自左至右,即先左后右。
例如:a+b*c,从这个表达式可以看到,乘法的优先级要高于加减法,因此,先进行b*c的运算,然后,再将其积加上a。
(a-b)*(c+d)+e,该表达式比上面的表达式稍微复杂点,因为括号在算术运算符中的优先级是最高的,故应先做括号内的运算,即完成(a-b)和(c+d)的运算,再将两个计算结果进行相乘,最后再加上e。算术运算符的结合性是自左向右的,也称“左结合性”。而自右向左的结合方向称为“右结合性”。最常见的右结合性运算符是赋值运算符。例如a=b=c,则应先执行b=c再执行a=(b=c)运算。在编写程序的过程中,希望大家注意其区别,以避免理解错误。
3.强制类型转换运算符
其一般形式为
(类型名)(表达式)
其功能是把表达式的运算结果值强制转换成类型名所表示的数据类型。
例如:
(float)a把a转换为实型数据
(int)(x+y)把x+y的结果转换为整型数据
4.自增、自减运算符
++:增量运算符。其功能是使变量值自增1。
--:减量运算符。其功能是使变量值自减1。
这两个运算符是C语言中所特有的,使用非常方便,其作用就是对变量做加1或减1操作。要注意的是变量在符号前或后,其含义是不同的。
i++ i参与运算后,i的值再自增1。(www.xing528.com)
i-- i参与运算后,i的值再自减1。
粗略地看,++i和i++的作用都相当于i=i+1,但++i和i++的不同之处在于++i先执行i=i+1,再使用i的值;而i++则是先使用i的值,再执行i=i+1。
例如:
若i的值原来为6,则
k=++i k的值为7,i的值也为7
k=i++ k的值为6,但i的值为7
若i的值为3,表达式k=(++i)+(++i)+(++i)的值应该为18,因为++i最先执行,先对表达式进行扫描,进行3次自加(++i),则此时i=6,之后,表达式应该体现为k=6+6+6=18,所以,我们才得出18这个数字。若表达式改为k=(i++)+(i++)+(i++),其最终的k值应该是9,而i最终为6,因此在这个表达式中,先对i进行三次相加,再执行三次i的自加。
【例3-11】
printf(“%d\n”,-i--);
}i的初值为10,第2行i加1后输出为11;第3行减1后输出为10;第4行输出i为10
之后再本身加1(此时i为11);第5行输出i为11之后再本身减1(此时i为10);第6行
输出-10之后再加1(此时i为11),第7行输出-11之后再减1(此时i为10)。
3.2.2.3 赋值运算符和赋值表达式
1.赋值运算符
赋值运算符“=”的作用就是将一个数据赋给一个变量。
其一般形式为:
变量=表达式
例如:
c=a+b
w=sin(x)+cos(y)
赋值表达式的作用是将表达式的计算结果值赋给“=”左边的变量。由于赋值运算符具有右结合性。因此
如果有:x=y=z=28
可理解为
x=(y=(z=28))
2.复合的赋值运算符
我们经常会看到一些源程序代码中,出现以下的运算符,这样做的好处是简化了程序,提高了C程序代码的编译效率。
+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=
其效果如下:
复合赋值符这种写法,对初学者来说可能不太习惯,但非常有利于编译处理,能提高编译效率并产生高质量的目标代码。
3.2.2.4 逗号运算符和逗号表达式
在C语言中,提供了一种特殊的运算符,它就是逗号运算符——“,”。用逗号运算符将两个表达式连接起来组成一个表达式,称为逗号表达式。
其一般形式为
表达式1,表达式2,表达式3,……表达式n
逗号表达式的求解过程是,从左到右计算出各个表达式的值,而整个逗号运算表达式的值等于最右边那一个表达式的值,就是“表达式n”的值。在大部分情况下,使用逗号表达式的目的只是为了分别得到各个表达式的值,而并不一定要得到使用整个逗号表达式的值。还需要注意的是,并不是程序中任何位置上出现的逗号都认为是逗号运算符。如函数中的参数,同数据类型变量的定义中的逗号只是用来起到间隔作用,而并不是逗号运算符。
【例3-12】
例3-12中,y等于整个逗号表达式的值,也就是(b+c)的值,x是第一个表达式的值。对于逗号表达式的使用过程中还请注意以下两点:
1)逗号表达式可以进行嵌套使用。
例如:
表达式1,(表达式2,表达式3)可以把(表达式2,表达式3)看成是一个逗号表达式。
2)程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,但并不一定求得整个逗号表达式的值。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。