C语⾔中的算术运算符和算术表达式
C语⾔中的算术运算符和算术表达式
C语⾔中运算和表达式的数量很多,C语⾔正是因为丰富的和表达式使其语⾔功能⼗分完善。C语⾔的运算符不仅具有不同的优先级,还有结核性。在表达式中,各运算表达量参与运算的先后要遵守运算符优先级别的规定,也要受运算符结合姓的制约,以便确定是⾃左向右还是⾃右向左进⾏运算。这种结合性,增加了C语⾔的复杂性。
⼀、C语⾔运算符简介
C语⾔的运算符可以分为以下⼏类:
1.算术运算符:⽤于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(%)、⾃增(++),⾃减(--),⼀共种;
2.关系运算符:⽤于⽐较运算。包括⼤于(>)、⼩于(<)、等于(==)、⼤于等于(>=)、⼩于等于(<=)、不等于(!=),⼀共6种;
3.逻辑运算符:⽤于逻辑运算。包括逻辑与(&&)、逻辑或(||),⾮(!),共3种。
4.位操作运算符:参与运算的量,按⼆进制位进⾏运算。包括位与(&)、位或(|)、位⾮(!)、位异或(^)、左移(<<)、右移(>>),共6种。
5.赋值运算符:⽤于赋值运算,分为简单赋值(=)、复合算术赋值(+=、-=,*=、/=、%=)、和复合位运算赋值(&=、!=、^=、
>>=、<<=),三类共11种;
6.条件运算符:这是⼀个三⽬运算符,⽤于条件求值(? :);
7.逗号运算符:⽤于把若⼲表达式组合成⼀个表达式(,);
8.指针运算符:⽤于取内容(*)和区地址(&),两种运算;
9.求字节数运算符:⽤于计算数据类型所占的字节数(sizeof);
10.特殊运算符:有括号( )、下标[ ]、成员(->,)等⼏种。
⼆、算术运算符和算术表达式
1.基本的算术运算符
加法运算符“+”:加法运算符为双⽬运算符,即应有两个量参与加法运算。如a+b,1+2等,具有右结合性。
减法运算符“-”:减法运算符为双⽬运算符。但“-”也可作负值运算符,此时为单⽬运算,如-a,-1等,具有左结合性。
乘法运算符“*”:双⽬运算,具有左结合性。
除法运算符“/”:双⽬运算,具有左结合性。参与运算量均为整型时,结果也为整型,舍去⼩数。如果运算量中有⼀个是实型,则结果为双精度实型。
求余运算符(模运算符)“%”:双⽬运算,具有左结合性。要求参与运算的量均为整型。 求余运算的结果等于两数相除后的余数。
2.算术表达式和运算符的优先级和结合性
表达式是由常量、变量、函数和运算符组合起来的式⼦。⼀个表达式有⼀个值及其类型, 它们等于计算表达式所得结果的值和类型。表达式求值按运算符的优先级和结合性规定的顺序进⾏。
运算符优先级图片算术表达式:⽤算术运算符和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式⼦。
运算符的优先级:C语⾔中,运算符的运算优先级共分为15级。1级最⾼,15级最低。在表达式中,优先级较⾼的先于优先级较低的进⾏运算。⽽在⼀个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合⽅向处理。
运算符的结合性:C语⾔中各运算符的结合性分为两种,即左结合性(⾃左⾄右)和右结合性(⾃右⾄左)。例如算术运算符的结合性是⾃左⾄右,即先左后右。如有表达式a-b+c则b应先与“-”号结合,执⾏a-b运算,然后再执⾏+c的运算。这种⾃左⾄右的结合⽅向就称为“左结合性”。⽽⾃右⾄左的结合⽅向称为“右结合性”。最典型的右结合性运算符是赋值运算符。如a=b=c,由于“=”的右结合性,应先执⾏
b=c再执⾏a=(b=c)运算。C语⾔运算符中有不少为右结合性,应注意区别,以避免理解错误。
3.强制类型转换运算符
其⼀般形式为: (类型说明符)  (表达式)
其功能是把表达式的运算结果强制转换成类型说明符所表⽰的类型。
例如:
(float)a      把a转换为实型
(int)(a+b)    把a+b的结果转换为整型
4.⾃增、⾃减运算符
⾃增1,⾃减1运算符:⾃增1运算符记为“++”,其功能是使变量的值⾃增1。⾃减1运算符记为“--”,其功能是使变量值⾃减1。
⾃增1,⾃减1运算符均为单⽬运算,都具有右结合性。可有以下⼏种形式:
++i  i⾃增1后再参与其它运算;
--i  i⾃减1后再参与其它运算;
i++  i参与运算后,i的值再⾃增1;
i--  i参与运算后,i的值再⾃减1。
在理解和使⽤上容易出错的是i++和i--。 特别是当它们出在较复杂的表达式或语句中时,常常难于弄清,因此应仔细分析。
举例:
#include《stdio.h>
int main(){
int i=4;
printf("%d\n",++i);
printf("%d\n",--i);
printf("%d\n",i++);
printf("%d\n",i--);
printf("%d\n",-i++);
printf("%d\n",-i--);
}
i的初值为4,第2⾏i加1后输出故为5;第3⾏减1后输出故为4;第4⾏输出i为4之后再加1(为5);第5⾏输出i为5之后再减1(为4) ;第6⾏输出-4之后再加1(为5),第7⾏输出-5之后再减1(为4)。
举例:
main(){
int i=1,j=2,a,b;
a=(i++)+(i++)+(i++);
b=(++j)+(++j)+(++j);
printf("%d,%d,%d,%d",a,b,i,j);
}
这个程序中,对a=(i++)+(i++)+(i++)应理解为三个i相加,分别是1+2+3,故a值为6。然后i再⾃增1⼀次相当于加3故1的最后值为4。⽽对于b 的值则不然,b=(++j)+(++j)+(++j)应理解为j先⾃增1,再参与运算,3+4+5的和为12,j的最后值为5,b的值为12。
5.赋值运算符和赋值表达式
5.1赋值运算符
简单赋值运算符记为=。由=组建的式⼦称为赋值表达式。
简单赋值表达式格式:变量=表达式;
赋值表达式的作⽤就是将赋值号右边表达式的值赋给赋值号左边的对象。赋值表达式的类型为赋值号左边对象的类型,其结果值为赋值号左边对象被赋值后的值。
简单赋值表达式使⽤说明
赋值运算符的功能具有单向性,即只能将表达式的值传送变量,反之则不然。
赋值运算符左边只能是单个变量名,不能是其他运算量。
赋值运算符右边可以是常量、变量、函数或表达式。
④ 赋值运算符兼有计算与赋值双重功能,它⾸先计算出赋值运算符右边表达式的值,然后把此值再赋给左侧的变量。
⑤ 赋值运算符具有右结合性。因此a=b=c=5可理解为a=(b=(c=5)),即表达式值为5,a,b,c均为5。这个表达式从右向左运算,在c被更新为5后,表达式c=5的值为5,接着b的值被更新为5,最后a被赋值为5。
⑥ 凡是表达式可以出现的地⽅均可出现赋值表达式。例如,式⼦x=(a=5)+(b=8)是合法的。其意义是把5赋给a,8赋给b,再把a与b相加,和赋给x,故x应等于13。
⑦ 赋值运算符的优先级低于算术运算符。
⑧ 按照C++语⾔规定,任何表达式在其末尾加上分号就构成语句,所以在赋值表达式末尾加分号就构成了赋值语句,在程序中⼤量使⽤。
赋值运算中的⾃动类型转换
如果赋值运算符两边的数据类型不相同,系统将⾃动进⾏类型转换,即把赋值运算符右边的类型转换成左边的类型。具体规定如下。
(1) 实型赋给整型,舍去⼩数部分。
(2) 整型赋给实型,数值不变,但将以浮点形式存放,即增加⼩数部分(⼩数部分的值为0)。
(3) 字符型赋给整型,由于字符型为⼀个字节,故将字符的ASCII码值放到整型量的低⼋位中,⾼位为0。整型赋给字符型,只把低⼋位赋给字符量。
(4) 在赋值运算中,赋值运算符两边量的数据类型不同时,赋值运算符右边量的类型将转换为左边量的类型。如果右边量的数据类型长度⽐左边长,将丢失⼀部分数据,这样会降低精度,丢失的部分按四舍五⼊向前舍⼊。
三、逗号运算符和逗号表达式
C语⾔提供⼀种特殊的运算符——逗号运算符。⽤它将两个表达式连接起来。如:
3+5,6+8
称为逗号表达式,⼜称为“顺序求值运算符”。逗号表达式的⼀般形式为
表达式1,表达式2
逗号表达式的求解过程是:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。例如,上⾯的逗号表达
式“3+5,6+8”的值为14。⼜如,逗号表达式
a=3*5,a*4
对此表达式的求解,读者可能会有两种不同的理解:⼀种认为“3*5,a*4” 是⼀个逗号表达式,先求出此逗号表达式的值, 如果a的原值为3,则逗号表达式的值为12,将12赋给a, 因此最后a的值为12。另⼀种认为:“a=3*5”是⼀个赋值表达式,“a*4”是另⼀个表达式,⼆者⽤逗号相连,构成⼀个逗号表达式。这两者哪⼀个对呢?赋值运算符的优先级别⾼于逗号运算符, 因此应先求解a=3*5(也就是
把“a=3*5”作为⼀个表达式)。经计算和赋值后得到a的值为15,然后求解a*4,得60。整个逗号表达式的值为60。
⼀个逗号表达式⼜可以与另⼀个表达式组成⼀个新的逗号表达式,如(a=3*5,a*4),a+5 先计算出a的值等于15,再进⾏a*4的运算得
60(但a值未变,仍为15),再进⾏a+5得20,即整个表达式的值为20。
逗号表达式的⼀般形式可以扩展为
表达式1,表达式2,表达式3……表达式n
它的值为表达式n的值。
逗号运算符是所有运算符中级别最低的。因此,下⾯两个表达式的作⽤是不同的:
① x=(a=3,6*3)
② x=a=3,6*a
第①个是⼀个赋值表达式,将⼀个逗号表达式的值赋给x,x的值等于18。
第②个是逗号表达式,它包括⼀个赋值表达式和⼀个算术表达式,x的值为3。
其实,逗号表达式⽆⾮是把若⼲个表达式“串联”起来。在许多情况下,使⽤逗号表达式的⽬的只是想分别得到各个表达式的值,⽽并⾮⼀定需要得到和使⽤整个逗号表达式的值,逗号表达式最常⽤于循环语句(for语句)中。
请注意并不是任何地⽅出现的逗号都是作为逗号运算符。例如函数参数也是⽤逗号来间隔的。如:
printf("%d,%d,%d",a,b,c);
上⼀⾏中的“a,b,c”并不是⼀个逗号表达式,它是printf函数的3个参数,参数间⽤逗号间隔。
如果改写为
printf("%d,%d,%d",(a,b,c),b,c);
则 (a,b,c)是⼀个逗号表达式,它的值等于c的值。括弧内的逗号不是参数间的分隔符⽽是逗号运算符。括弧中的内容是⼀个整体,作为printf函数的⼀个参数。
C语⾔表达能⼒强,其中⼀个重要⽅⾯就在于它的表达式类型丰富,运算符功能强,因⽽c使⽤灵活,适应性强。
总结:
1 、 左移运算符左移⼀位相当于乘⼆,其效率⽐乘以2的效率⾼。左移其右边⾃动补零,右移其左边补符号位。
2 、 这些操作符的优先级顺序    ! > 算术运算符 > 关系运算符 > && > || > 赋值运算符。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。