
C语言表达式和算术运算符资料课件.ppt
46页第第3章章 表达式和运算符(表达式和运算符(3))3.5 运算符和表达式运算符和表达式u 3.5.1 运算符的种类、优先级和结合性运算符的种类、优先级和结合性u 3.5.2 算术运算符和算术表达式算术运算符和算术表达式u 3.5.3 赋值运算符和赋值表达式赋值运算符和赋值表达式u 3.5.4 增量运算符和增量表达式增量运算符和增量表达式u 3.5.8 逗号运算符和逗号表达式逗号运算符和逗号表达式3.5运算符和表达式运算符和表达式C C运运算算符符算术运算符算术运算符::+ - * / % 自增自减运算符自增自减运算符::++ --关系运算符关系运算符::< <= == > >= !=逻辑运算符逻辑运算符::!(逻辑非逻辑非), &&( 逻辑与逻辑与), ||(逻辑或逻辑或);位运算符位运算符 ::~ (按位取反按位取反), &(位与位与), |(位或位或), ^(异或异或), <<(左移左移), >>(右移右移);赋值运算符赋值运算符::= 及其扩展赋值运算符及其扩展赋值运算符条件运算符条件运算符::?:逗号运算符逗号运算符::,指针、地址运算符指针、地址运算符::* * &求字节数求字节数 ::sizeof强制类型转换强制类型转换::(类型类型)成员运算符成员运算符::. ->下标运算符下标运算符::[ ]其它其它 :函数调用运算符:函数调用运算符( ) 等等运算符和表达式运算符和表达式优先级优先级是指表达式中包含是指表达式中包含多个运算符时,多个运算符时,先进行优先进行优先级高先级高的运算符操作,然的运算符操作,然后进行优先级低的运算符后进行优先级低的运算符操作;操作;当表达式中包含的几个运当表达式中包含的几个运算符的算符的优先级全相同优先级全相同时,时,由由运算符的结合性运算符的结合性来决定来决定他们的运算顺序。
他们的运算顺序结合性结合性: 同一优先级,同一优先级,自左向右,为自左向右,为左结合性左结合性,,反之为反之为右结合性右结合性初等运算符初等运算符( [ ]、、( )、、 . 、、-> )↓单目运算符单目运算符↓算术运算符算术运算符↓关系运算符关系运算符↓逻辑运算符逻辑运算符(不包括逻辑非运算不包括逻辑非运算符符!)↓赋值运算符赋值运算符↓逗号运算符逗号运算符3.5.2算术运算符和算术表达式算术运算符和算术表达式 1 1、、基本的算术运算符基本的算术运算符: :++ (加法运算符,或正值运算符如(加法运算符,或正值运算符如: :3+5、+3)3+5、+3)-- (减法运算符,或负值运算符如(减法运算符,或负值运算符如: :5-2、-3)5-2、-3)* * (乘法运算符如(乘法运算符如: :33* *5)5)// (除法运算符如(除法运算符如: :5/3)5/3)%% (模运算符,或称求余运算符,%两侧均应为整型数据,(模运算符,或称求余运算符,%两侧均应为整型数据,如如: :7%4的值为3)7%4的值为3)算术运算符算术运算符的优先级别:的优先级别: * *、、/ /、、% %优优先于先于 + + 、、 − (*(*、、/ /、、% %不分不分) ) ,()级别最高,,()级别最高,单单目运算符目运算符优优先双目运算符先双目运算符 如如 − 2 − 4算术运算符和算术表达式算术运算符和算术表达式 2、算术表达式、算术表达式((1))表达式表达式由常量、变量、函数和运算符组成的式子称为表达式由常量、变量、函数和运算符组成的式子称为表达式例:计算圆面积的语句例:计算圆面积的语句 s=3.14159* *r* *r; 该语句中该语句中r,,3.14159,,3.14159* *r,,3.14159* *r* *r,, s=3.14159* *r* *r都是表达式都是表达式 * *是运算符,是运算符, 3.14159是常量,是常量,s是变量是变量((2))表达式的求值规则表达式的求值规则,按照运算符的优先级和结,按照运算符的优先级和结合性的规定顺序进行。
一个表达式有一个值及其类合性的规定顺序进行一个表达式有一个值及其类型型算术运算符和算术表达式算术运算符和算术表达式((3)算术表达式)算术表达式 是由算数运算符和操作数组合成的式子,是由算数运算符和操作数组合成的式子,算术表算术表达式用于各类数值运算达式用于各类数值运算除求余运算符除求余运算符%外,运算对外,运算对象可以是整型,也可以是实型象可以是整型,也可以是实型 如:如:(-b-sqrt(d))/(2.0* *a)n运算对象包括常量、变量、函数等运算对象包括常量、变量、函数等n一个常量、变量都可作为一个表达式一个常量、变量都可作为一个表达式n例例: 以下是合法的算术表达式:以下是合法的算术表达式: a*b/c-1.5+ 'a' 3* *x+1.0/y―10* *sqrt(x) (x+y)%(x+b-c/d) 100 x算术运算符和算术表达式算术运算符和算术表达式说明:说明:1))“%”是求余运算是求余运算a%b计算计算a除以除以b以后的余数,也是以后的余数,也是a模模b的值它要求的值它要求两个运算对象都是整型两个运算对象都是整型量,其量,其结果也是整型量。
结果也是整型量当运算量为负数时,所得结果的符号与被除数(当运算量为负数时,所得结果的符号与被除数(a)相同如:如:17%-3=2 -19%4=-3 -15%-7=-1 5%1.5是非法的算术表达式是非法的算术表达式2)除法运算符)除法运算符“/”进行求商运算对于不同类型的运算对象,进行求商运算对于不同类型的运算对象,除法表达式计算结果的类型也会不同除法表达式计算结果的类型也会不同例:计算例:计算x/y如果如果x,,y为整型,小数部分为整型,小数部分舍去舍去, ,没有四舍五入没有四舍五入如果如果x,,y中有一个为实型量,则中有一个为实型量,则x,,y都被化为都被化为double类型进类型进行计算,结果为行计算,结果为double算术运算符和算术表达式算术运算符和算术表达式运算实例:运算实例:x,,y为整型量:为整型量:5/2结果为结果为2,整型量,整型量 2/5结果为结果为0,整型量,整型量x,,y其中一个为实型量其中一个为实型量5.0/2或或 5.0/2.0或或 5.0/2.0结果为结果为2.5,,实型量实型量练习:练习:例例例例 1/2 =1/2 = -5/2 = -5/2 = -5/2.0 = -5/2.0 =例例例例 5%2 = 5%2 = -5%2 = -5%2 = 5%-2 = 5%-2 = 1%10 = 1%10 = 5%1 = 5%1 = 5.5%2 5.5%2 = = 0 0-2-2-2.5-2.51 1-1-11 11 10 0 高高 ( )( ) + - ( + - (正号正号, , 负号负号) ) * / % * / % 低低 + - (+ - (加加, , 减减) )§ § 例例: : a*b/c-1.5+ 'a'a*b/c-1.5+ 'a' (x+y)%(x+b-c/d) (x+y)%(x+b-c/d)例如例如 (--16/3**2+1)%6的值的值_______. 计算方法:-计算方法:-16/3值为-值为-5,然后-然后-5**2+l值为-值为-9,最后-最后-9%6值为-值为-3。
算术运算符和算术表达式算术运算符和算术表达式3)双目运算符两边的运算类型必须一致才能进行操)双目运算符两边的运算类型必须一致才能进行操作,所得结果类型与运算类型一致;作,所得结果类型与运算类型一致;如:如:1.0/2.0=0.5 1/2=04)如果)如果类型不一致,系统将自动把两边转换成相同类型不一致,系统将自动把两边转换成相同类型后进行运算;类型后进行运算;如:如:1.0/2=0.5 1/2.0=0.5 整型转实型整型转实型 短整型转长整型短整型转长整型 有符号转无有符号转无符号符号5))C语言中语言中所有实数的运算均以双精度方式进行所有实数的运算均以双精度方式进行,,若是单精度数,则在尾数部分补若是单精度数,则在尾数部分补0,使之转化为双,使之转化为双精度;精度;例:将数学式改写成算术表达式例:将数学式改写成算术表达式一般数学式一般数学式 算术表达式算术表达式[a(b+c)+d]ac (a* *(b+c)+d)* *a* *c 3.14159* *r* *r/2.0 x/(x+y)+1.0/x* *y算术运算符和算术表达式算术运算符和算术表达式基本运算符实例基本运算符实例基本运算符实例:基本运算符实例:main(){int a,b,c1,c2; a=3,b=7; c1=b/a; c2=b%a; printf(“c1=%d\tc2=%d\n”,c1,c2); c1=a/b; c2=a%b;printf(“c1=%d\tc2=%d\n”,c1,c2);}标准库函数调用标准库函数调用对于某些数学运算,如求对于某些数学运算,如求平方根,指数,对数运算平方根,指数,对数运算,,C语言中有标准库函数对其进行计算。
语言中有标准库函数对其进行计算调用格式:函数名(参数,参数,调用格式:函数名(参数,参数,····))其中函数名由系统提供,不同其中函数名由系统提供,不同C编译系统,提供的函数编译系统,提供的函数名不同,使用时需查阅相关手册名不同,使用时需查阅相关手册调用函数时,参数的类型必须与系统规定一致调用函数时,参数的类型必须与系统规定一致调用标准库函数之前,通常要调用标准库函数之前,通常要用预编译命令用预编译命令“#include math.h”将所需要的库函数信息包含到用将所需要的库函数信息包含到用户源文件中户源文件中使用数学库函数使用数学库函数在使用数学库函数以前,需使用编译命令在使用数学库函数以前,需使用编译命令#include “math.h”例:计算例:计算x(2+xy)的值的值#include “math.h”main(){double x,y; x=5.0;y=7.0; printf(“z=%f\n”,x* *(2.0+pow(x,y)));}算术表达式中数据类型的转换算术表达式中数据类型的转换3、各类型数值数据的转换、各类型数值数据的转换 当表达式中的当表达式中的各类数值型数据参与混合运算各类数值型数据参与混合运算时,时,要进行类型转换要进行类型转换下面表达式合法:下面表达式合法:1+3.14159+’0’+’A’转换方式转换方式自动转换自动转换:数据类型自动由低级向高级转换。
数据类型自动由低级向高级转换强制转换强制转换:将表达式的运算结果:将表达式的运算结果强制转换成指定的强制转换成指定的数据类型数据类型算术表达式中数据类型的转换算术表达式中数据类型的转换自动转换规则:自动转换规则:floatdoublelongunsignedintCharshort低低高高自动自动自动自动算术表达式中数据类型的转换算术表达式中数据类型的转换10+‘10+‘a’ +i*f - d/ea’ +i*f - d/e§ § 例:例: intint i; i; float f; float f; double d; double d; long e; long e;intintintintdoubledoubledoubledoubledoubledoubledoubledoubledoubledoubledoubledouble练习:练习:1 1..若若有有定定义义::intint a; a; 则则语语句句a=(4 a=(4 * * 5)+ 5)+ 4 4 % % 5;5;运行后,运行后,a a的值为(的值为( ))2 2..设设doubledouble型型变变量量a,b,c,ea,b,c,e均均有有值值; ;对对代代数数式式(3ae)/(bc)(3ae)/(bc),不正确的,不正确的C C语言表达式是(语言表达式是( )。
(A) a/(A) a/b/cb/c*e*3 (B) 3*a**e*3 (B) 3*a*e/b/ce/b/c (C) 3*a* (C) 3*a*e/be/b*c (D) a**c (D) a*e/c/be/c/b*3*33. P3. P5959 3.3 3.4 3.3 3.43.5.3赋值运算符和赋值表达式赋值运算符和赋值表达式1、赋值运算符和赋值表达式、赋值运算符和赋值表达式赋值表达式的一般格式为:变量赋值表达式的一般格式为:变量=表达式表达式说明:说明: 1))赋值运算符赋值运算符左边必须是变量左边必须是变量而不能是而不能是常量或常量或表达式表达式,右边是合法的右边是合法的c语言表达式;语言表达式; 例:例:j+3=j a* *b=c* *4 5=x x+1=y* *a+3 错误错误 2))赋值表达式的值是赋值号左边变量被赋值后赋值表达式的值是赋值号左边变量被赋值后的值;的值;正确的表示形式:正确的表示形式: x=10 x=y n=n+1 3))赋值语句可以连续进行赋值语句可以连续进行 a=b=7+1 等价于等价于a=(b=(c=0) 赋值运算符和赋值表达式赋值运算符和赋值表达式2、复合的赋值表达式、复合的赋值表达式算术运算符算术运算符“+-* */%”和赋值运算符和赋值运算符”=“结合结合+=::a+=b+3,等价于等价于a=a+(b+3)-=:: a-=b+3,等价于等价于a=a-(b+3)* *=::a* *=b+3,等价于等价于a=a* *(b+3)/=::a/=b+3,等价于等价于a=a/(b+3)%=::a%=b+3,等价于等价于a=a%(b+3) >>=,,<<=,,&=,,^=,,|=赋值运算符和赋值表达式赋值运算符和赋值表达式注意:注意:1)复合运算符)复合运算符左边必须是变量左边必须是变量2)复合运算符右边的表达式计算完成后才参与复合)复合运算符右边的表达式计算完成后才参与复合赋值运算赋值运算3)复合运算符的结合性和优先级等同于简单赋值运)复合运算符的结合性和优先级等同于简单赋值运算符算符”=”4)复合运算符)复合运算符常用于某个变量自身的变化常用于某个变量自身的变化,尤其是,尤其是当左边的变量名很长时,使用复合运算符书写更当左边的变量名很长时,使用复合运算符书写更方便。
书写时,两个运算符之间不能有空格书写时,两个运算符之间不能有空格5)C语言规定可以使用10种复合赋值运算符:)C语言规定可以使用10种复合赋值运算符:+=,-=,+=,-=,*=,/=,%=,=,/=,%=,<<=,=,>>=,&=,&=,=,∧∧=,=,|== 赋值运算符和赋值表达式赋值运算符和赋值表达式3、赋值类型转换、赋值类型转换 如果赋值号两边的类型不一致,则将如果赋值号两边的类型不一致,则将赋值号右边赋值号右边表达式的值的类型转换成表达式的值的类型转换成赋值号左边变量的类型;赋值号左边变量的类型; 例:例:float f=1.0 int a=2,b=3; char c=‘A’; f=a+b+c; (f为实型量,结果为为实型量,结果为70.0)赋值结果与类型转换赋值结果与类型转换说明:说明: 1)实型数据(包括单、双精度)赋给整型变量时,)实型数据(包括单、双精度)赋给整型变量时,舍弃舍弃实数的小数部分实数的小数部分如:如:设设 i 为整型变量,执行为整型变量,执行 i = 5.34,, i 的值为的值为 52)整型数据赋给实型变量时,数值不变,但)整型数据赋给实型变量时,数值不变,但以浮点数形以浮点数形式存储到变量中式存储到变量中。
如:对如:对 float 型变量型变量 f ,执行,执行 f = 23 f 的值为的值为 23.0000003))double赋给赋给float型变量时,型变量时,截取其前面截取其前面7位有效位有效数字,数字,存储到存储到float型变量的存储单元;型变量的存储单元; float型变量赋给型变量赋给double时,时,有效位扩展到有效位扩展到16位位,在内存中以,在内存中以8个字节存储个字节存储赋值结果与类型转换赋值结果与类型转换例例:void main ( ){ int i;float f;i = 5.34;f = 23;printf ("i=%d,f=%f\n", i, f );}结果:结果:i=5,f=23.000000赋值结果与类型转换赋值结果与类型转换4))char、、int、、long等类型的转换等类型的转换①①“短短”数据赋给数据赋给“长长”变量变量符号扩展:若最高位为若最高位为 1(负数),则变量高字节位补(负数),则变量高字节位补 1;反之,补;反之,补 0void main ( ){char c;short int i;c = 43;i = c;printf ( " i = %hd\n", i );c = '\376'; i = c;printf ( " i = %hd\n", i );}c的值?的值?43-2赋值结果与类型转换赋值结果与类型转换 0 0 1 0 1 0 1 143号字符号字符'+' '\53' 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 i 1 1 1 1 1 1 1 0254号字符号字符 '\376' 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1i赋值结果与类型转换赋值结果与类型转换②② “长长”数据赋给数据赋给“短短”变量变量截断:截断:只将数据的低字节位只将数据的低字节位原封不动送到变量中原封不动送到变量中void main ( ){ short int i; long l = 6324232L; i = l; printf ( " i = %hd\n", i );} 0 00 00 00 00 00 10 00 1i = -3276010 00 00 00 00 00 10 00 0 0 00 00 00 01 10 00 00 l=6324232赋值结果与类型转换赋值结果与类型转换5)无符号整型与有符号整型)无符号整型与有符号整型例例:void main( ){unsigned a;int b = -1;a = b;printf ( "%d -> %u\n", b, a );a = 65534u; b = a ;printf ( "%d -> %u\n", b, a );} 1 11 11 11 11 11 11 11 1b11 11 11 11 11 11 11 11 a结果:结果:-1 -> 65535-2 -> 65534赋值运算符和赋值表达式赋值运算符和赋值表达式赋值表达式赋值表达式 由赋值运算符将一个变量和一个表达式连接起来由赋值运算符将一个变量和一个表达式连接起来的式子称为的式子称为“赋值表达式赋值表达式”。
一般形式为一般形式为: <变量变量><赋值运算符赋值运算符><表达式表达式> 例如例如: ““a=a=5”5”是一个赋值表达式是一个赋值表达式赋值运算符和赋值表达式赋值运算符和赋值表达式对赋值表达式求解的过程是:对赋值表达式求解的过程是: ①①求赋值运算符右侧的求赋值运算符右侧的“表达式表达式”的值的值; ②②赋给赋值运算符左侧的变量赋给赋值运算符左侧的变量例如例如: 赋值表达式赋值表达式““aa=3*5”=3*5”的值为的值为1515,执行表达,执行表达式后,变量式后,变量a a的值也是的值也是1515注意注意: 一个表达式应该有一个一个表达式应该有一个值值左值左值 ( (lvaluelvalue) ) : : 赋值运算符左侧的标识符赋值运算符左侧的标识符u变量可以作为左值变量可以作为左值; ;u而表达式就不能作为左值而表达式就不能作为左值( (如如a+ba+b););u常量也不能作为左值,常量也不能作为左值,赋值运算符和赋值表达式赋值运算符和赋值表达式请分析下面的赋值表达式请分析下面的赋值表达式∶∶(a=3*5)=4*3(a=3*5)=4*3分析:先执行括弧内的运算,将先执行括弧内的运算,将1515赋给赋给a a,然后执行,然后执行4*34*3的运算,得的运算,得1212,再把,再把1212赋给赋给a a。
最后最后a a的值为的值为1212,整个表达式的值为,整个表达式的值为1212可以看到可以看到∶∶(a=3*5)(a=3*5)出现出现在赋值运算符的左侧,因此赋值表达式在赋值运算符的左侧,因此赋值表达式(a=3*5)(a=3*5)是是左值左值注意:在对赋值表达式在对赋值表达式(a=3*5)(a=3*5)求解后,变量求解后,变量a a得到值得到值1515执行执行(a=3*5)=4*3(a=3*5)=4*3时,实际上是将时,实际上是将4*34*3的积的积1212赋赋给变量给变量a a,而不是赋给,而不是赋给3*53*5不能写成不能写成:a=3* *5=4* *3赋值运算符和赋值表达式赋值运算符和赋值表达式赋值表达式也可以包含复合的赋值运算符赋值表达式也可以包含复合的赋值运算符 如:如:a+=a-=a*aa+=a-=a*a分析分析: :此赋值表达式的求解步骤如下此赋值表达式的求解步骤如下∶∶① ① 先进行先进行““a-=aa-=a* *aa””的运算,的运算, 相当于a=a-a相当于a=a-a* *a,a,a a的值为12-的值为12-144144=-=-132132②②再进行再进行““a+=-132a+=-132””的运算,的运算,相当于a相当于a=a+(-132)=a+(-132),,a a的值为-的值为-132-132132-132==-264-264。
赋值运算符和赋值表达式赋值运算符和赋值表达式[补充例题补充例题] main() { int i=5; i+ =i* * = i+6; printf("i=%d\n",i); }分析表达式分析表达式i+=i* *=i+6的执的执行过程:行过程:结合方向是结合方向是"从右到左从右到左",先先计算计算i+6的值为的值为11; 计算后计算后i的值不变仍为的值不变仍为5;再计算再计算i* *=11, 相当于相当于i=i* *11,因此因此i=5* *11, i的值变的值变成成55;最后计算最后计算i+=55, 相当于相当于i=i+55, 因此因此i=55+55, i的的值最后变成值最后变成110赋值运算符和赋值表达式赋值运算符和赋值表达式[补充例题补充例题] main() { int i=-5, j=0x9961, k; unsigned int u; unsigned char ch; u=i; ch=j; k=ch; printf("u=%x,u=%u,ch=%c,k=%d\n", u, u, ch, k); } 运行结果:运行结果: u=fffb,u=65531,ch=a,k=97赋值运算符和赋值表达式赋值运算符和赋值表达式例:赋值语句程序实例例:赋值语句程序实例main() {int a,b,c; a=b=c=9; printf(“a=%d,b=%d,c=%d\n”,a,b,c); a=(b=4)+(c=6); printf(“a=%d,b=%d,c=%d\n”,a,b,c); a+=b+c; printf(“a=%d,b=%d,c=%d\n”,a,b,c); a+=a-=a* *=a; a+=a-=a+ +a; printf(“a=%d\n”,a);} 9 9 910 4 620 4 60赋值运算符和赋值表达式赋值运算符和赋值表达式4、强制类型转换、强制类型转换格式:(数据类型说明符)(表达式)格式:(数据类型说明符)(表达式)注意:注意:1)强制转换属单目运算,运算优先级为)强制转换属单目运算,运算优先级为22)强制转换得到的是中间变量类型,原变量类型不)强制转换得到的是中间变量类型,原变量类型不变。
变例:例:int x,y; float z; (float)(x+y); (int) z+x;例例: (double)1/2 的值为的值为0.5,, 因为因为(double)1 将整型数将整型数 1 转换转换成成1.0 (双精度类型双精度类型),,1.0/2值为值为0.5赋值运算符和赋值表达式赋值运算符和赋值表达式例例3.11强制类型转换强制类型转换 #include "stdio.h"main(){float x; int i; x=3.6; i=(int)x; printf("x=%f,i=%d\n",x,i);}3.5.4增量运算符和增量表达式增量运算符和增量表达式1、自增、自减运算符、自增、自减运算符 作用:作用: 自增运算符自增运算符++: 使变量的值增使变量的值增1 自减运算符自减运算符--: 使变量的值减使变量的值减12、两种形式、两种形式前缀形式前缀形式: ++i, --i (在使用在使用i之前,先使之前,先使i的值加的值加1(减减1))后缀形式后缀形式: i++, i-- (在使用在使用i之后,再使之后,再使i的值加的值加1(减减1))增量运算符和增量表达式增量运算符和增量表达式例:例: j=++i; j=i++; 等价于等价于 等价于等价于 j=i+1; j=i; i=i+1; i=i+13、结合方向与优先级:、结合方向与优先级:++,,--的结合方向:从右至左的结合方向:从右至左++,,--的优先级:的优先级:高高 ++ --++ -- * / % * / % 低低 + -+ -例:例:例:例:intint j=5, i=1, k, n; j=5, i=1, k, n; n=-++i; n=-++i; k=--j k=--j* * * *2;2;-2 8增量运算符和增量表达式增量运算符和增量表达式例:若例:若 i=1; j=++i; 则则j 的值为的值为2(i先加先加) 若若 i=1; j =i++; 则则j 的值为的值为1 (i后加后加)运算符和运算对象的关系有运算符和运算对象的关系有"结合方向结合方向"如:若如:若i=1; j= -i++;则则j 的值为的值为-1。
i 后加后加, i的值的值为为2)负号与负号与++, --结合方向都是从右到左结合方向都是从右到左, 不要看成不要看成 j=(-i)++, (- i) ++是错误的表达式是错误的表达式,最好分成多句最好分成多句j= -i; i++;例:若例:若 int k, i=2, j=4; 则表达式则表达式 k=(++i)* *(j--) 的值是(的值是( )12增量运算符和增量表达式增量运算符和增量表达式补充补充例题:补充补充例题: main() { int i=3, j, k, m, n; j=i++* *++i; k= --i* *--i; m= ++i* *++i; n= ++i* *i--; printf("j=%d,k=%d,m=%d,n=%d\n", j, k, m, n); }j=16,k=9,m=25,n=363.5.83.5.8逗号运算符和逗号表达式逗号运算符和逗号表达式逗号运算符逗号运算符¨运算符:,运算符:,¨作用:连接两个表达式作用:连接两个表达式。
¨优先级:最低优先级:最低¨结合方向:从左至右结合方向:从左至右逗号表达式逗号表达式¨一般形式:一般形式: 表达式表达式1, 表达式表达式2, ……, 表达式表达式nn例:例:i=1, j=0 x/(y+1), a+b, 3*4逗号运算符和逗号表达式逗号运算符和逗号表达式¨求值过程:从左至右依次求表达式求值过程:从左至右依次求表达式1, 表达式表达式2, …, 表达式表达式n的值,最后一个表达式的值为整个的值,最后一个表达式的值为整个逗号表达式的值逗号表达式的值n例:例:x=(a=3, 6* *3)¨注意:逗号运算符优先级最低,要注意加括号注意:逗号运算符优先级最低,要注意加括号n例:比较例:比较 x=(a=3, 6*3) 与与 x=a=3, 6*3¨并不是任何地方出现的逗号都是作为逗号运算并不是任何地方出现的逗号都是作为逗号运算符例如函数参数也是用逗号来间隔的:例如函数参数也是用逗号来间隔的: printf("%d,%d,%d",a,b,c);练习:练习:例:逗号表达式例:逗号表达式a=3* *5,a* *4赋值运算符的优先级别高于逗号运算符,赋值运算符的优先级别高于逗号运算符, 因此应先因此应先求解a=3求解a=3* *5。
a的值为1a的值为15,然后求解a,然后求解a* *4,4,得60整个逗号表达式的值为60得60整个逗号表达式的值为60练习:练习: ①① x=(a=3,6x=(a=3,6* *3)3) ②② x=a=3,6x=a=3,6* *3赋值表达式,将一个逗号表达式的值赋给x,x的值等于18 逗号表达式,包括一个赋值表达式和一个算术表达式,x的值为3,整个逗号表达式的值为18 逗号运算符和逗号表达式逗号运算符和逗号表达式[实例实例]main(){ int i, j; j=( i=2, i++, i++); printf(" i=%d, j=%d\n", i, j); } 此处的此处的 i++, i++与与前面我们介绍的前面我们介绍的i++* *i++的的运算运算法则是不一样的,它可以等同与法则是不一样的,它可以等同与++i, i++ 能不能等同与:能不能等同与:i++, ++i4 3。












