1、第三讲 运算符与表达式,内容摘要:,1,变量赋初值,2,掌握C语言中的各种运算符,3,掌握运算符的优先级与结合性,教学重点:,C语言中各种运算符的使用,教学难点:,混合表达式中运算符的运算顺序,运算符与表达式,2.6 变量赋初值,程序中常需要对一些变量预先设置初值。 C语言允许在定义变量时对变量赋初值 -变量的初始化。,int a=3; /* 指定a为整型变量,初值为3 */float f=3.56; /* 指定f为实型变量,初值为3.56 */char c=a; /* 指定c为字符变量,初值为a */,1.可以对定义变量的一部分初始化如: int a,b,c=5;,2.如果对几个变量赋以同一
2、个初值,不能写成:int a=b=c=3;而应写成:int a=3,b=3,c=3;,3. 初始化不是在编译阶段完成的,而是在程序运行时,执行函数时赋初值的,相当于有一个赋值语句。例如:,int a=3;,相当于:,int a;a=3;,2.7 运算符和表达式,C的运算符有以下几类,1算术运算符 (+ - * / % ) 2赋值运算符 (= 及其扩展赋值运算符)3. 逗号运算符 (,)4关系运算符 ( = | &)7条件运算符 (? :) 8其它,2.7.1 C语言运算符,2、学习运算符应注意: 运算符功能 与运算量关系 要求运算量个数 要求运算量类型 运算符优先级别 结合方向 运算结果的类型
3、,2.7 运算符和表达式,2.7.1 C语言运算符,2.7 运算符和表达式,C语言允许使用以下类型的表达式,2.7.2 C语言表达式类型,(1)赋值表达式,如:a=1,(6)逗号表达式,如:a=1,b=2,c=3,(2)算术表达式,如:1*2+3/4.5,(3)关系表达式,如:47,(4)逻辑表达式,如:84&ab,(5)条件表达式,如:ab?a:b,2.7 运算符和表达式,2.7.3 表达式的求值规则,(1)按运算符的优先级别高低次序执行。,(2)如果运算对象两侧优先级别相同,则按规定的“结合方向”处理。,如:算术运算符的结合方向为“从左至右”赋值运算符的结合方向为“从右至左”,1.基本的算
4、术运算符+ (加法运算符,或正值运算符。如35、3)- (减法运算符,或负值运算符,如5-2、-3)* (乘法运算符。如3*5) (除法运算符。如53) (模运算符,或称求余运算符,要求两侧均为整型数据,如74的值为3)。,说明,2.7 运算符和表达式,2.7.4 算术运算符和算术表达式,2.算术表达式和运算符的优先级与结合性,用算术运算符和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子,称C算术表达式。运算对象包括常量、变量、函数等。例如,下面是一个合法的C算术表达式:a*b/c-1.5+a,在表达式求值时:先按运算符的优先级别高低次序执行同一优先级的运算符,运算次序由结合方向
5、决定,C语言规定了运算符的优先级和结合性。,算术运算符的结合方向为“自左至右”,即先左后右. 单目运算符、三目运算符、赋值运算符的结合方向为“自右至左”,即先右后左.,2.7 运算符和表达式,2.7.4 算术运算符和算术表达式,运算符的优先级(由高到低) 附录B,初等运算符 ( ) - .,单目运算符,算术运算符 (先乘除,后加减),关系运算符,逻辑运算符 (不包括!),条件运算符,赋值运算符,逗号运算符,2.7 运算符和表达式,3.强制类型转换运算符,可以利用强制类型转换运算符将一个表达式转换成所需类型。,一般形式:(类型名)(表达式),例如:(double)a (将a的值转换成double
6、类型)(int)(x+y) (将x+y的值转换成整型)(float)(53) (将53的值转换成float型),强制类型转换时,得到一个所需类型的中间量,原来变量的类型未发生变化。,main() float x;int i; x=3.6;i=(int)x;printf(“x=%f,i=%d“x,i);,运行结果如下: x=3.600000,i=3,2.7 运算符和表达式,4,自增、自减运算符+ - 作用:使变量值加1或减1 种类: 前置 +i, -i (在使用i之前,先使i的值加(减)1) 后置 i+,i- (先使用i值,再使i的值加(减)1 ),例 j=3; k=+j; j=3; k=j+;
7、 j=3; printf(“%d”,+j); j=3; printf(“%d”,j+); a=3;b=5;c=(+a)*b; a=3;b=5;c=(a+)*b;,/k=4,j=4,/k=3,j=4,/4,/3,/c=20,a=4,/c=15,a=4,2.7 运算符和表达式,说明: + - 不能用于常量和表达式,如5+,(a+b)+ + -结合方向: 自右向左,例 自增、自减运算符的用法与运算规则示例。 /*程序功能:自增、自减运算符的用法与运算规则示例*/ main() int x=6, y;printf(“x=%dn“,x); /*输出x的初值*/y = +x; /*前置运算*/printf
8、(“y=+x: x=%d,y=%dn“,x,y); y = x-; /*后置运算*/printf(“y=x-: x=%d,y=%dn“,x,y); 程序运行结果: x=6 y=+x: x=7,y=7 y=x-: x=6,y=7 程序演示,2.7 运算符和表达式,1.赋值运算符(=),作用:将一个数据赋给一个变量,也可以将一个表达式的值赋给一个变量。如:a=3,2.类型转换,(1)将实型数据(包括单、双精度)赋给整型变量时,舍弃实数的小数部分。,(2)将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中。,(3)将一个double型数据赋给一个float变量时,截取其前面的7位有
9、效数字,存放到float变量的存储单元中(32位)。但应注意数值范围不能溢出。 (4). 其它转换规则参考教材,2.7 运算符和表达式,2.7.5 赋值运算符和赋值表达式,3、赋值运算符 简单赋值运算符 符号: = 格式: 变量标识符=表达式 作用:将一个数据(常量或表达式)赋给一个变量,复合赋值运算符 在赋值运算符“=”之前加上其他预算符号,可以构成复合的预算符。 例如,可以有:,2.7.5 赋值运算符和赋值表达式,定义:由赋值运算符将一个变量和一个表达式连接起来的式子。 形式: 求解过程:先求赋值运算符右侧“表达式”的值,然后赋给赋值运算符左侧的变量。 例如:a=b=c=6;a=(b=4)
10、+(c=6);(表达式值为10,a值为10,b等于4,c等于6),4、赋值表达式,2.7.5 赋值运算符和赋值表达式,说明: 1、赋值运算后,左边变量的值被右边表达式的值替换; 2、若右边表达式的值的类型与左边变量类型不一致,则以左边变量的类型为准,将表达式的类型转换为左边变量的类型。 3、赋值运算符的优先级仅高于逗号运算符。结合方向为“从右向左”。,形式:表达式1,表达式2,表达式n 结合性:从左向右 优先级: 所有运算符中优先级最低 逗号表达式的值:等于表达式n的值 求解过程:先求表达式1,再求表达式2,依次求下去,直到求出表达式n,整个逗号表达式的值就是表达式n的值,例 a=3*5,a*
11、4a=3*5,a*4,a+5 例 x=(a=3,6*3)x=a=3,6*a 例 a=1;b=2;c=3;printf(“%d,%d,%d”,a,b,c); printf(“%d,%d,%d”,(a,b,c),b,c);,/a=15,表达式值60,/a=15,表达式值20,/赋值表达式,表达式值18,x=18,/逗号表达式,表达式值18,x=3,/1,2,3,/3,2,3,2.7.6 逗号运算符和逗号表达式,求解过程分析: 自左至右,依次计算各表达式的值,“表达式n” 的值即为整个逗号表达式的值。 例如,逗号表达式“a = 3 * 5, a * 4”的值=60:先求解a = 3 * 5,得a=1
12、5;再求a * 4 = 60,所以逗号表达式的值=60。 又例如,逗号表达式“(a = 3 * 5, a * 4), a + 5”的值=20:先求解a = 3 * 5,得a=15;再求a * 4=60;最后求解a + 5=20,所以逗号表达式的值=20。 注意:并不是任何地方出现的逗号,都是逗号运算符。很多情况下,逗号仅用作分隔符。,2.7.6 逗号运算符和逗号表达式,2.7.7 关系运算符及关系表达式,1,关系运算符及其优先次序,在C语言中提供6种关系运算符,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符,2.7.7 关系运算符及关系表达式,2,关系表达式,用关系运算符将
13、两个表达式(算术表达式、关系表达式、逻辑表达式、赋值表达式、字符表达式)连接起来的式子,称为关系表达式。,如: a b , ( A = 3 ) ( B = 5 ) , A B 这些都是合法的关系表达式。,在 C 语言中关系表达式的值是一个逻辑值,即“真”或“假”。 C 语言中以“1”代表“真”,以“0”代表“假”。,例:若 a=3 , b=2 , c=1 则: a b 的值为“真”,此表达式的值为 1。 (ab) = c 的值为“真”,表达式的值为 1。(此处 ab 的值为 1 ,1= c 的值当然为1) f = abc f 的值为0,小结,变量赋初值,运算符与表达式,算术运算符与算术表达式,赋值运算符与赋值表达式,逗号运算符与逗号表达式,关系运算符与关系表达式,运算符与表达式,