1、2.9 运算符与表达式,运算是对数据进行加工的过程,用来表示各种不同运算的符号称为运算符。 表达式:是用运算符与圆括号将操作数连接起来的式子。,C运算符(共有13类),1. 基本算术运算符 + / %,3. 逻辑运算符 ! & ,2. 关系运算符 = = !=,一、算数运算符和算数表达式,1、基本算术运算符,+ 加法,正值。 如: 3+6, +3, 减法,负值。 如: 6 4, 5, 乘法。 如: 38,/ 除法。 如: 8 / 5 4.3/2,% 求余。 如: 7 % 4 的值为3,注意:,两个整数相除的结果为整数,求余运算符%,要求两个操作数均为整型,结果为两数相除所得的余数。,5%3的值
2、为2;-5%3的值为-2;5%(-3)的值为2;-5%(-3)的值为-2;12.3%3 ,5/2的值为2 -5/3的值为-1 8/(-6)的值为-1 5.0/2的值为2.5-5.0/2的值为-2.5,2、算术表达式及算术运算符的优先级,运算对象: 常量、变量、函数等,优先级: ( ), , /, %, +, ,算术表达式: 用算术运算符和括号将运算对象连接起来的式子。,3+6*9 (x+y)/2-1 4*cos(3.14) a*b/c-1.5+a a b / c 1.5 + ad e,3、算术运算符的结合性,运算符的结合性:是指如果一个操作数左边和右边的两个运算符的优先级相同,应该优先计算的操
3、作符。,运算结合方向:1. 自左向右,为左结合性。 2. 自右向左,为右结合性。,a*b/c-1.5+a,C语言规定双目算术运算符的结合性是自左向右,例如:a+b-c先计算b-c,还是先计算a+b呢?,表2-1 基本运算符列表,4、算术表达式的解就是经过算术运算得到的表达式的值。,3*(8-2)的解是18 Fab(-45)+23 的解是68,int x=12,y=34; x+y-(y-x) 的解是24,再对表达式求值时,先按运算符的优先级别高 低次序执行,再按运算符的结合方向进行结合。,例如:a+b*c-2,练习,函数f(x)=3x3+2x2+x+1,编写一程序计算并输出f(3),解题步骤:
4、1、定义整型变量x,y 2、从键盘输入自变量的值存放在变量x中 3、计算函数值 4、输出函数值,5、强制类型转换运算符,强制类型转换将一个算术表达式转换为所需类型。,形式: (类型名) (表达式),例如: (double) a 将a转换为double,(int) (x+y) 将x+y转换为int,(float) (5%3) 将5%3转换为float,注: 括号不能省略。否则: int x 会理解为变量int x.,又如: (int) (x+y) 若省略: (int)x+y会变成只将x转成整型.,例如:(double)a /*将变量a的值转换成double型*/(int)(x+y) /*将x+y
5、的结果转换成int 型*/(float)5/2 /* 将5转换成实型,再除以2(=2.5),等价于(float)(5)/2 */(float)(5/2) /* 将5整除2的结果转换成实型(2.0) */,转换后的类型数据由系统分配一个中间变量存放,而原变量类型不变。 若有: float x;,则: (int)x; x本身仍为实型,而(int)x由一个中间变量(整) 存放原来x的整数部分。,注意:,练习:,从键盘上输入一个球的半径值,计算并输出这个球的体积。球的体积公式为:V=4/3r3,#include”stdio.h” #define PAI 3.1415926 main() float r
6、, v; scanf(“%f”, ,4.0/3*PAI*r*r*r;,二、赋值运算符和表达式 简单赋值运算符 符号: = 格式: 变量标识符=表达式 作用:将一个数据(常量或表达式)赋给一个变量,复合赋值运算符 种类:+= -= *= /= %= = = &= = |= 含义: exp1 op= exp2 exp1 = exp1 op exp2,例 a=3;d=func();c=d+2;,说明: 结合方向:自右向左 左侧必须是变量,不能是常量或表达式,赋值表达式的值与变量值相等,且可嵌套,赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型,例 3=x-2*y;a+b=3;,例 flo
7、at f; int i;i=10; f=i; 则 f=10.0,例 int i; i=2.56; /结果i=2;,例: a=b=c=5a=(b=5)a=5+(c=6)a=(b=4)+(c=6)a=(b=10)/(c=2),/表达式值为5,a,b,c值为5,/ b=5;a=5,/表达式值11,c=6,a=11,/表达式值10,a=10,b=4,c=6,/表达式值5,a=5,b=10,c=2,练习:,#include main() int a,b,c,x,y;a=2;y=x=2*a+6;printf(“n a=%d”, a);printf(“n x=2*a+6 is %d”, x=2*a+6);p
8、rintf(“n y=%d”, y);c=b=a=4;printf(“nb=a=4 is %d ”, b=a=4);printf(“na=%d,b=%d,c=%d ”, a, b,c); ,三、不同类型数据间的转换,例如:已知: float a=2.0;int b=6,c=3;求解: a*b/c-1.5+a+fabs(-5)=?,但有一个规则:先转换成同一类型,再计算。,C语言允许双精度、单精度、整型及字符数据之间混合运算是允许的。,图中“ ” 表示必定转换。如a + b,先转换为int。结果为 int。,即: 既使是同一种类型也按“ “转换。,图中“ ” : 表示低, 高型数据运算时,均先转
9、换为高型。,解析:,float a=2.0; int b =6,c =3;a*b/c -1.5 +a +fabs(-5),12.0/3,5,4.0 - 1.5,2.5 + 97(int),99.5 + 5,104.5(double),例 int i;float f;double d;long l;,练习,已知:float a=2.0; int b =6,c =3;试编写程序计算:a*b/c +1.5 +a +fabs(-5.75),四、关系运算符,1、6种关系运算符:= = != 2、关系表达式:用关系运算符将表达式连接起来的式子 优先级: (= ) ( = != ) 结合性:自左至右; 表达
10、式的值: 若为真,则结果为1;若为假,则结果为0。,35 的值为 0;32 的值为0; 3+(43 的值为1。 算术运算符优先级高于关系运算符 关系运算符优先级高于赋值运算符,例 int a=3,b=2,c=1,d,f;ab (ab)=cb+cbf=abc,例 若a=0; b=0.5; x=0.3;则 a=x=b的值为,例 5278在C中是允许的,值为,例 a0 结果为A100 结果为,实例,1,0,0,0,例 应避免对实数作相等或不等的判断 如 1.0/3.0*3.0=1.0 结果为 可改写为:fabs(1.0/3.0*3.0-1.0)1e-6,0,#include “stdio.h“ vo
11、id main() int x,y,z1,z2;x=2 ;y=2 ;z1=(x=y);z2=(x=y);printf(“%d,%dn“,z1,z2); ,练习,五、逻辑运算符 及其表达式,C语言中的逻辑运算符有三个:逻辑与 &、逻辑或 | 和逻辑非 !,C语言中: 0表示“逻辑假”非0表示“逻辑真”,逻辑运算真值表:,如果一个表达式参与逻辑运算,只要这个 表达式的解为非0,则系统就认为这个表达式 的结果是逻辑真。但是要注意,系统逻辑运算的结果仍然只 有两个:1(逻辑真)和0(逻辑假)。逻辑运算符经常与关系运算符一起使用。C语言表达式(x=10)&(x=100)的数学含义是:10x100,注意:
12、,逻辑运算符的优先级:!& |高 低,! 高 算术运算符 关系运算符 & | 赋值运算符 低,计算表达式以下表达式的值:79-!0,练习,六、 增1/减1运算符,(一般用于整型变量),+ i=i+1,- i=i-1,作用:使变量值自身加1或减1 种类:1、前置 +i, -i 2、后置 i+, i-,说明: 1、+ - 不能用于常量和表达式,如5+,(a+b)+ 2、+ -结合方向: 自右向左 3、优先级:- + - -* / % -+ -,例如: i=3; i=3;j=i+; j=+i;结果 j的内容为3 j的内容为4i的内容为4 i的内容为4,注意: 增1/减1运算符的优先级高于算术运算符,
13、 与单目运算符-(取负)、!(逻辑非)的 优先级相同,结合方向自右至左。例如表达式 -i+ 等价于 -(i+) 副作用:printf(“ %d ,%d”,i,i+);在不同的编译环境下结果有可能不同。 尽量不要在一般的表达式中将增1/减1运算符与其它运算符混合使用。,请写出如下程序的输出: #includemain( ) int i=3,j;j=-i+;printf(“i=%d,j=%dn“,i,j);,练习,七、 位逻辑运算符, & | 按位取反 左移 右移 按位与 按位或 按位异或操作数在实现位操作时按二进制进行运算,一般应为无符号型整数。操作数可以是常量也可以是变量,还可以是表达式。,按
14、位与w3的内容可以通过下式运算: 0000101000001000 (按位与&)00001000 (结果),&运算经常用于把特定位清零(屏蔽)。 例如,a的值为11011010,b的值为11110000,a&b11011010& 11110000 11010000相当于把a的低4位屏蔽,高4位不变。,按位或 | 按位或的运算规则是: 0 | 0=0 0 | 1=1 1 | 0=1 1 | 1=1 例如: char w1,w2,w3; w1=10; w2=8; w3= w1|w2 ;w3的内容可以通过下式运算: 0000101000001000 (按位或 |)00001010 (结果),按位异或
15、 按位或的运算规则是: 0 0=0 0 1=1 1 0=1 1 1=0 例如: char w1,w2,w3; w1=10; w2=8; w3= w1w2 ;w3的内容可以通过下式运算: 0000101000001000 (按位异或 )00000010 (结果),按位取反 按位取反的规则是: 0 = 1 1 = 0 注意:对于位逻辑反来说,0x7在16位机上的 表示是1111111111111000即0xfff8,但在32位 机上的表示是0xfffffff8,所以通常用0x7 来表 示7的逻辑非,而不用0xfff8或oxfffffff8。,移位运算符 左移 双目运算符,运算符右边的表达式表示移位
16、的位数。x=x2 表示把x进行左移以后赋值给x, 注意 不能只用x2左移可以扩大原数的倍数,左移位扩大 倍,左移位扩大倍,。右移可以缩小 原数的倍数。右移时,若符号位为,则右边 填零。若符号位为,根据机器不同分为算术 移位(填充)逻辑移位(填充)。,八、 逗号运算符,形式:表达式1,表达式2, ,表达式n 结合性:从左向右 逗号表达式的值:等于表达式n的值 用途:常用于循环for语句中,例 a=3*5,a*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”
17、,(a,b,c),b,c);,/a=15,表达式值60,/a=15,表达式值20,/赋值表达式,表达式值18,x=18,/逗号表达式,表达式值18,x=3,/1,2,3,/3,2,3,例: #include main() int x,y=7;float z=4.0;x=(y=y+6,y/z);printf(“x=%dn“,x); ,运行结果:x=3,九、求字节数运算符sizeof是一个比较特殊的单目运算符,也 是一个非常有用的运算符,经常用于动态分 配空间。其语法格式为:sizeof(表达式) 表达式可以是变量名、常量、以及数据 类型名。,它的功能是: 1、求表达式中变量名所代表的存储单元所占
18、的字节数; 2、求表达式中常量的存储单元所占的字节数; 3、求表达式中的数据类型表示的数据在内存单元中所占的字节数。sizeof(int)的结果是2, sizeof运算符比较灵活,同样是求整型int 数据所占的字节数,可以使用三种办法: (1) 求sizeof(int) (2) 求sizeof(10) (3) 使用int a; 求sizeof(a),实例 求各种有数据类型在内存中所占的位(bit)数。 #include “stdio.h“ void main(c) printf(“char =%d bitn“,8*sizeof(char);printf(“short int =%d bitn“,8*sizeof(short int);printf(“int =%d bitn“,8*sizeof(10);printf(“long int =%d bitn“,8*sizeof(10L);printf(“float =%d bitn“,8*sizeof(float);printf(“double =%d bitn“,8*sizeof(2.3);printf(“china“=%d bitn“,8*sizeof(“china“); ,