1、运算符,运算符(13类),算术运算符( + ) 关系运算符( !) 逻辑运算符(! & |) 赋值运算符(及其扩展赋值运算符) 条件运算符(? :) 逗号运算符(,) 其它 运算量的个数:单目、双目、三目,算术运算符,+、-、*、/、% %两侧必须为整型数据 运算结果取两侧数据中的最高级 运算对象包括常量、变量、函数等 a*b/c-1.5+a (*、/、%)、(+、-)同一级别自左向右结合,自反运算,如: c = a+b - (双元运算)a=a+b 可写为: a+ = b - (自反加运算) - = , * = , / = , %= . C = b* = a+5; 等价于: b=b*(a+5)
2、 ; c=b; 两个语句 与赋值符同级别 结合方向:自右向左 凡是二元运算符,都可以与赋值符组成复合赋值符,自反运算符的求解步骤,a+=b(其中a为变量,b为表达式) a+=b(将下划线的“a+”移到“=”右侧) a=a+b(在“=”左侧补上变量名) 如果b是包若干项的表达式,则相当于它有括号,自加和自减运算符,使变量的值增1或减1 +i , -i(先加减后使用)i=i+1 i+ , i-(先使用用后加减)i=i-1 int i=5; int i=5; x=i+; x=+i; y=i; y=i; x= x= y= y=,5,6,6,6,自加和自减,只能用于整型变量,不能用于常量和表达式 +(i
3、+) 不合法 +和-的结合方向是“自右向左” -i+ -(i+) (i+)+ (i+)+ (i+) i=3 9 (+i)+ (+i)+ (+i) 18,正负号运算符,+(正号)、-(负号) 一元运算符,优先级别高于*、/ 结合方向为自右向左 -a*b; main() i=3; printf(“%d”,-i+);,main() i=3; printf(“%d”,-+i);,3,4,赋值运算符,=(赋值运算符),将一个数据赋给一个变量 赋值运算符两侧的类型不一致,要进行类型转换 实型整型,截去小数部分 整型实型,数值不变,以定点形式存储 字符整型,放在低8位,并对高8位进行扩展 整型长整型,符号扩
4、展 无符号整型长整型,零扩展 无符号整型整型,原样照赋,符号位作为数值 级别低,仅高于逗号运算符,自右向左结合,赋值表达式,由赋值运算符将变量和表达式连接起来的式子 一般形式 变量=表达式 赋值表达式的值为变量的值 例: a=5 a=b=c=5 a=5+(c=6) a=(b=4)+(c=6) a=(b=10)/(c=2) a+=a -=a*a,a=5 a=5,b=5,c=5 a=5+6=11 a=4+6=10 a=10/2=5 a+=(a=a -a*a) a=(a-a*a)+(a-a*a),逗号运算符,,将两个表达式连接起来 35,68; 一般形式:表达式1,表达式2; 求解过程:先求表达式1
5、,再求表达式2,最后结果为表达式2的值 逗号表达式中可以包含逗号表达式 级别最低,自左向右结合 函数参数中的逗号是用来分隔的printf(“%d,%d,%d”,a,b,c); x=(a=3*5,a*4);,X=60,关系运算,(大于) =(大于等于) =x+1=y+2,z=0 z=1 z=2=3=5 z=0=5 z=1,关系运算符的特点,判断x是否在a,b范围内,应写成a=x 字符数据的比较按其ASCII码进行 判断浮点数时,由存储上的误差,结果会错误 1.0/3.0*3.0=1.0 fabs(1.0/3.0*3.0-1.0)1e-5,a=2,逻辑运算符,&(逻辑与) |(逻辑或) !(逻辑非
6、),+,- (a)与,+,- (b)或,+,- (c)非,逻辑运算符的特点,&和|是二元运算符,结合方向自左向右,低于关系运算符 !为一元运算符,高于关系运算符 a&b 若a、b为真,则a&b为真 a|b 若a、b之一为真, a|b则为真 !a 若a为真,则!a 为假 0|a=a 1&a=a 1|a=1 0&a=0 a|!a=1 a&!a=0 a|a=a a&a=a,逻辑表达式,在给出逻辑表达式结果时,真 1 ,假 0 逻辑运算符两侧的运算对象不但可以是0和1,也可以是任何类型的数据,系统最终以0或非0来判定“真”或“假! 例:判别某一年year是否闰年。 (year%4=0&year%100
7、!=0)|year%400=0,条件运算符,? : 条件运算符为三元运算符 条件表达式 e1?e2:e3 若e1为真(非0),则条件表达式为e2的值; 若e1为假(0),则条件表达式为e3的值 优先级仅高于赋值符,结合方向自右向左 e1应为算术表达式,e2,e3可为任意类型,结果类型为e2,e3中较高的一种,例,main() char ch; scanf(“%c”, ,N n,例2-6 输入2数,输出小者,main() float a,b,min;printf(“input: “);scanf(“%f %f“, ,上例可节省一个变量 min 的空间,main() float a,b;print
8、f(“input: “);scanf(“%f %f“, ,输出部分直接使用表达式,数据转换,数据转换,基本形式 同一类型但长度不同的数据的转换 定点与浮点方式之间的转换 有符号数与无符号数的转换,转换方式,提升(短长、整浮) 降格(长短、浮整) 符号位扩展(signed)与零扩展(unsigned) 最高位失去符号功能(signed unsiged)与最高位变成符号位(unsiged signed) 截去小数(实数整数) 与四舍五入(doubel float),例,main() double a=123456.789098765; float b;long c;int i,j; b=a;c=a
9、;i=a;j=c; printf(“a=%lf,b=%f,c=%ld,i=%d,j=%un”, a,b,c,i,j);,a=123456.789099,b=123456.789062, c=123456,i= -7616, j= -7616,不同类型数据的隐式转换,一般算术转换 将char或short自动转换为相应的int 将float转换为double 当运算符两端的运算类型不一致时,按“向高看齐”的原则对“较低”的类型进行提升double float long unsigned int char,short,高,低,例, char ch; int i,result; float f;dou
10、ble d; result=ch / i + f * d -( f + i ),int,double,double,int,double,double,double,double,double,main() int a,b,c; scanf(“%d,%d”, a=0 b=2 c=1 a=0 b=1 c=0,main() int a,b,c; scanf(“%d,%d”, a=0 b=2 c=1.0 a=0 b=1 c=0.5,赋值转换,赋值号右边值的类型自动转换为左边的类型 具有强制性,可能是提升,也可能是降格,1. main()int i=-69;unsigned un=5;printf(“
11、%d+%u=%un”,i,un,i+un);printf(“%d+%u=%dn”,i,un,i+un); 2. main()int i,j;long a=80000,b=3200L;printf(“%ld=%dn”,a,i=a);printf(“%ld=%dn”,b,j=b);,-69+5=65472 -69+5=-64,80000=14464 3200=3200,输出转换,不同类型的显式转换,强制类型转换运算符: (类型标识符)表达式 显式转换是单元(单目)运算 对变量进行显式转换后,得到一新的类型的数据,但原来变量的类型不变 (char)(3-3.14159*x) k=(int)(int)x+(float)i+j) (float)(x=99),2.48,“%5d%5d%c%c%f%f%*f,%f” 1:10 20Aa1.5-3.75 12.8,67.8 2:10 20Aa 1.5 -3.75 12.8,67.8 3:1020Aa1.5-3.7512.8,67.8,Declaration syntax error 变量定义时出现语法错误 Undefined symbol “xxxxx” 符号“xxxxx”没有定义 Re declaration of “xxxxx” 对“xxxxx”进行重定义 Statement missing “;” 语句缺少;,