版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第3章 运算符、表达式和语句,运算符与表达式概述 算术运算符和算术表达式 赋值运算符和赋值表达式 数据类型的转换 逗号运算符和逗号表达式 关系运算符和关系表达式 逻辑运算符和逻辑表达式,3.1 运算符与表达式概述,运算是对数据的加工过程,表示不同运算的符号叫做运算符,而参与运算的数据叫做操作数。不同的计算机语言有不同的运算符集。 在C语言中,除了几个控制语句外,几乎所有的操作都是通过由运算符构造的表达式来完成,因此C语言运算符的作用范围很广。,学习运算符应注意: 运算符功能 与运算量关系 要求运算量个数(单目+,双目+、*,三目?:) 要求运算量类型 运算符优先级别 结合方向(左结合,右结合)
2、 结果的类型,关于“结合性”的概念是其它高级语言没有的,是语言的特点之一。语言的运算符较多,又有其优先级和结合性,初学者要特别仔细,善于归纳。,例: a=b=c=8 相当于a=(b=(c=8),3.2 算术运算符和算术表达式,基本算术运算符: + - * / % 结合方向:从左向右 优先级: - -* / % - + - (2) (3) (4) 说明: “-”可为单目运算符时,右结合性 两整数相除,结果为整数 %要求两侧均为整型数据,例 5/2 = 2 -5/2.0 = -2.5,例 5%2 = 1 -5%2 = -1 1%10 = 1 5%1 = 0 5.5%2 = (),例 5/2 = -
3、5/2.0 =,例 5%2 = -5%2 = 1%10 = 5%1 = 5.5%2 =,例 j=3; k=+j; j=3; k=j+; j=3; printf(“%d”,+j); j=3; printf(“%d”,j+); a=3;b=5;c=(+a)*b; a=3;b=5;c=(a+)*b;,自增、自减运算符+ - 作用:使变量值加1或减1 种类: 前置 +i, -i (先执行i+1或i-1,再使用i值) 后置 i+,i- (先使用i值,再执行i+1或i-1),/k=4,j=4,/k=3,j=4,/4,/3,/c=20,a=4,/c=15,a=4,例3.4 测试表达式中前置、后置增量运算符的
4、运算顺序。 #include void main() int i=5, j, k; j=+i; printf(i=%d, j=%d , i, j); k=i+; printf(i=%d, k=%dn, i, k); ,运算结果为: i=6, j=6, i=7, k=6,例3.5 多个增量(减量)运算符组成的表达式的运算顺序。 #include void main() int i=3, k; k=(i+)+(i+)+(i+); printf(i=%d, k=%d , i, k); i=3; k=(+i)+(+i)+(+i); printf(i=%d, k=%d , i, k); i=3; k=(
5、+i)+(i+)+(+i); printf(i=%d, k=%dn, i, k); ,运行结果为: i=6, k=9 i=6, k=18 i=6, k=15,3.3 赋值运算符和赋值表达式,赋值运算符和表达式 简单赋值运算符 符号: = 格式: 变量标识符=表达式 作用:将一个数据(常量或表达式)赋给一个变量,复合赋值运算符 种类:+= -= *= /= %= = = d=func(); c=d+2;,赋值表达式的值与变量值相等,且可嵌套,赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型,例 3=x-2*y; a+b=3;,例 float f; int i; i=10; f=i;
6、则 f=10.0,例 int i; i=2.56; /结果i=2;,例: a=b=c=5 a=(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,简单赋值运算符说明: 结合方向:自右向左 优先级: 14 左侧必须是单个变量,不能是常量或表达式,复合赋值运算符说明: 结合方向:自右向左 优先级: 12 左侧必须是变量,不能是常量或表达式,赋值表达式的值与变量值相等,且可嵌套,赋值转换规则:使
7、赋值号右边表达式值自动转换成其左边变量的类型,例: a=12; a+=a-=a*a,例: int a=2; a%=4-1; a+=a*=a-=a*=3;,/a=-264 等价于a=a+(a=a-(a*a),/a=0 等价于a=a+(a=a*(a=a-(a=a*3),3.4 数据类型的转换,隐式转换 什么情况下发生 运算转换-不同类型数据混合运算时 赋值转换-把一个值赋给与其类型不同的变量时 输出转换-输出时转换成指定的输出格式 函数调用转换-实参与形参类型不一致时转换 运算转换规则:不同类型数据运算时先自动转换成同一类型,隐式转换规则:,例3.7 不同类型整型数据间的赋值验证。 #includ
8、e void main() int a=53, b=-3, c=65533, d=0 xABCDE; long x=a, y=b; unsigned u=-2; printf(a=%d, a=%un, a, a); printf(b=%d, b=%un, b, b); printf(c=%d, c=%un, c, c); printf(d=%d, d=%xn, d, d); printf(u=%d, u=%un, u, u); printf(x=%ld, x=%lxn, x, x); printf(y=%ld, y=%lxn, y, y); ,运行结果如下: a=53, a=53 b=-3,
9、b=65533 c=-3, c=65533 d=-17186, d=bcde u=-2, u=65534 x=53, x=35 y=-3, y=fffffffd,图3.5 例3.7中各变量存储单元的存储结果,显式转换(强制转换) 一般形式:(类型名)(表达式) 例 (int)(x+y) (int)x+y (double)(3/2) (int)3.6 说明:强制转换得到所需类型的中间变量,原变量类型不变,例 main() float x; int i; x=3.6; i=(int)x; printf(“x=%f,i=%d”,x,i); 结果:x=3.600000,i=3,精度损失问题,3.5 逗
10、号运算符和逗号表达式,逗号运算符和表达式 形式:表达式1,表达式2,表达式n 结合性:从左向右 优先级: 15 逗号表达式的值:等于表达式n的值 用途:常用于循环for语句中,例 a=3*5,a*4 a=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,例: #include
11、main() int x,y=7; float z=4; x=(y=y+6,y/z); printf(x=%dn,x); ,运行结果:x=3,逗号运算符和表达式 形式:表达式1,表达式2,表达式n 结合性:从左向右 优先级: 15 逗号表达式的值:等于表达式n的值 用途:常用于循环for语句中,3.6 关系运算符和关系表达式,关系运算符和表达式 关系运算符 种类:= != 结合方向:自左向右 优先级别:,例 ca+b /c(a+b) ab!=c /(ab)!=c a=bc /a=(bc),关系表达式的值:是逻辑值“真”或“假”,用1和0表示,例 int a=3,b=2,c=1,d,f; ab
12、(ab)=c b+cb f=abc,/表达式值1,/表达式值1,/表达式值0,/d=1,/f=0,关系运算注意:,例 5278在C中是允许的, 值为,例 int i=1, j=7,a; a=i+(j%4!=0); 则a=,例 a0 结果为 A100 结果为,例 注意区分“=”与“=” int a=0,b=1; if(a=b) printf(“a equal to b”); else printf(“a not equal to b”);,0,2,1,0,3.7 逻辑运算符和逻辑表达式,逻辑运算符和表达式 逻辑运算符 种类: ! b=5; !a a x=(a=1) ,运行结果如下: x=0, a
13、=1 ,b=0, c=3,条件运算符与表达式 一般形式: expr1 ? expr2 : expr3 执行过程 功能:相当于条件语句,但不能取代一般if语句,条件运算符可嵌套 如 x0?1:(x0?-1:0) 优先级: 13,结合方向:自右向左 如 ab?a:cd?c:d ab?a:(cd?c:d) expr1、expr2、expr3类型可不同,表达式值取较高的类型,例 x?a:b /x=0,表达式值为b; x0,表达式值为a xy?1:1.5 /xy ,值为1.0; xy ,值为1.5,例 求 a+|b| printf(“a+|b|=%dn”,b0?a+b:a-b);,例 (a=b)?Y:N
14、 (x%2=1)?1:0 (x=0)?x:-x (c=a 2.声明语句 3.程序控制语句(9种):,如 total=total+limit; a=3; func( ); printf(“Hello,world!n”);,3.8C语言基本结构控制语句,4.函数调用语句,5.空语句 ; 6.复合语句:用 括起来的一组语句 一般形式: 数据说明部分; 执行语句部分; 说明: “”后不加分号 语法上和单一语句相同 复合语句可嵌套,3.8.2 赋值语句,一般形式: 变量名=表达式;,例如: b=c=5; if (a=b) t=a; if (a=b) t=a; if (a=b)0) t=a;,if (a=
15、b;)0) t=a; 错了,因为C编译器将把它看成是如下两条语句: if (a=b; )0) t=a;,形式二: 格式:if (expression) statement1 else statement2 执行过程:,if语句(条件选择语句) if语句的三种形式 形式一: 格式:if (expression) statement 执行过程:,3.8.3分支语句(if语句与条件表达式),形式三: 格式:,if ( expr1 ) statement1 else if (expr2 ) statement2 else if (expr3 ) statement3 . else statement
16、n ,执行过程:,如:if(a=b,说明: if后面的表达式类型任意,语句可以是复合语句if(x10)a=1;b=2,c=3 if(x) if(x!=0) if(!x) if(x=0),/#include main() int x,y; printf(Enter an integer:); scanf(%d, ,例 求一个数的绝对值,运行:Enter an integer:-12 integer:-12-absolute value :12,# include # include void main() float a, b, c; float s, l; printf(Please inpu
17、t three numeric value:n); scanf(%f%f%f, ,if (a+bc ,例3.9 输入三角形的3个边长a、b、c,求出三角形的面积。提示:用海伦公式S=sqrt(l*(l-a)*(l-b)*(l-c),其中l是半周长,sqrt是求平方根的函数,在math.h中定义。,运行结果如下: Please input three numeric value: 3 4 5 area of triangle: 6.000000,#include void main() int c; float pay, discount; printf(Input customer rank:
18、n); scanf(%d, ,例3.10 某商店实行会员制,为不同的会员设定了不同的折扣,普通会员打九折,银卡会员打八五折,金卡会员打八折。编写程序,根据用户输入的会员等级和所购商品总金额,输出应付金额。,运行情况如下: Input customer rank: 1 Input amount of payment: 50 You should pay: 45.00,条件运算符与表达式 一般形式表达式1 ?表达式2 :表达式3 执行过程 功能:相当于条件语句,但不能取代一般if语句,条件运算符可嵌套 如 x0?1:(x0?-1:0) 优先级: 13,结合方向:自右向左 如 ab?a:cd?c:d
19、 ab?a:(cd?c:d) expr1、expr2、expr3类型可不同,表达式值取较高的类型,例 x?a:b /x=0,表达式值为b; x0,表达式值为a xy?1:1.5 /xy ,值为1.0; xy ,值为1.5,例 求 a+|b| printf(“a+|b|=%dn”,b0?a+b:a-b);,例 (a=b)?Y:N (x%2=1)?1:0 (x=0)?x:-x (c=a if(ab) if(ac) printf(“a=%dn”,a); else printf(“b=%dn”,b); printf(“c=%dn”,c); ,例3.11 求解一元二次方程ax2+bx+c=0的根。,#i
20、nclude #include void main() float a, b, c, delta, x1, x2, realpart, imagpart; scanf(%f,%f,%f, else if (delta0) ,/ else if (delta0) x1=(-b+sqrt(delta)/(2*a); x2=(-b-sqrt(delta)/(2*a); printf(has distinct real roots: %.4f and %.4fn, x1, x2); else realpart=-b/(2*a); imagpart=sqrt(-delta)/(2*a); printf(
21、has complex roots:n); printf(t%.4f+%.4fi and , realpart, imagpart); printf(%.4f-%.4fin, realpart, imagpart); ,switch语句(开关分支语句) 一般形式:,switch( 表达式) case E1: 语句组 1; break; case E2: 语句组 2; break; . case En: 语句组 n; break; default: 语句组n+1 ; break; ,执行过程:,说明: E1,E2,En是常量表达式,且值必须互不相同 语句标号作用,必须用break跳出 case后
22、可包含多个可执行语句,且不必加 switch可嵌套 多个case可共用一组执行语句,如: case A: case B: case C: printf(“score60n”); break; .,例 switch(score) case 5: printf(“Very good!”); case 4: printf(“Good!”); case 3: printf(“Pass!”); case 2: printf(“Fail!”); default : printf(“data error!”); ,运行结果:score为5时,输出: Very good! Good! Pass! Fail!
23、data error!,#include main() int c; float pay, discount; printf(Input customer rank:n); scanf(%d, ,pay=pay*discount; printf(You should pay: %.2fn, pay); ,例4.20 用switch语句写出例3.10的源程序。,运行情况如下: Input customer rank: 1 Input amount of payment: 50 You should pay: 45.00,补充例子:输入两个整数,按升序输出。,#include main() int
24、 x,y,t; scanf(“%d,%d”, Printf(“x、y升序输出为n”,x,y) ,思考题:输入三个数,要录按升序输出。,3.8.4 循环语句(while语句与for语句),概述 C语言可实现循环的语句: (1) while 语句 (3) do while 语句 (2) for 语句 (4) 用goto 和 if 构成循环,一般形式:,while(表达式) 循环体语句;,执行流程:,1 while语句,特点:先判断表达式,后执行循环体 说明: 循环体有可能一次也不执行 循环体可为任意类型语句 下列情况,退出while循环 条件表达式不成立(为零) 循环体内遇break,return
25、,goto 无限循环: while(1) 循环体;,例3.12 用while循环求自然数1100的和,/#include main() int i,sum=0; i=1; while(i=100) sum=sum+i; i+; printf(%d,sum); ,sum=1+2+3+100,sum,sum=0+1 sum=1+2=3 sum=3+3=6 sum=6+4 sum=4950+100=5050,补充例 子:显示110的平方,#include main() int i=1; while(i=10) printf(%d*%d=%dn,i,i,i*i); i+; ,运行结果: 1*1=1 2
26、*2=4 3*3=9 4*4=16 5*5=25 6*6=36 7*7=49 8*8=64 9*9=81 10*10=100,dowhile语句 一般形式:,do 循环体语句; while(表达式);,执行流程:,1.2dowhile语句,特点:先执行循环体,后判断表达式 说明: 至少执行一次循环体 dowhile可转化成while结构,例4.21 用dowhile循环求自然数1100的和,/ #include main() int i,sum=0; i=1; do sum+=i; i+; while(i=100); printf(%dn,sum); ,例 while和dowhile比较,#i
27、nclude main() int i,sum=0; scanf(%d, ,main() int i,sum=0; scanf(%d, ,一般形式:,for(expr1 ; expr2 ; expr3) 循环体语句;,执行流程:,2 for语句,for语句一般应用形式:,for(循环变量赋初值;循环条件;循环变量增值) 循环体语句; ,说明: for语句中expr1, expr2 ,expr3 类型任意,都可省略,但分号;不可省 无限循环: for(;) for语句可以转换成while结构,expr1; while(expr2) 循环体语句; expr3; ,例:#include main(
28、) int i=0; for(i=0;i10;i+) putchar(a+i); ,运行结果:abcdefghij,例:#include main( ) int i=0; for(;i10;i+) putchar(a+i); ,例:#include main( ) int i=0; for(;i10;) putchar(a+(i+); ,例:#include main( ) int i=0; for(;i10;putchar(a+i),i+) ; ,main() int i,j,k; for(i=0,j=100;i=j;i+,j-) k=i+j; printf(%d+%d=%dn,i,j,k)
29、; ,#include main() char c; for(;(c=getchar()!=n;) printf(%c ,c); ,#include main() int i,c; for(i=0;(c=getchar()!=n;i+=3) printf(%c ,i+c); ,例3.14 求输入的十个整数,找出其中最大的数。,/#include main() int x,maxnum,n=2; scanf(%d, ,循环的嵌套 三种循环可互相嵌套,层数不限 外层循环可包含两个以上内循环,但不能相互交叉 嵌套循环的执行流程,(1) while() while() . ,(2) do do whi
30、le( ); . while( );,(3) while() do while( ); . ,(4) for( ; ;) do while(); while() . ,嵌套循环的跳转 禁止: 从外层跳入内层 跳入同层的另一循环 向上跳转,3 循环的嵌套,for(i=1;i10;i+) for(j=1;j10;j+) 循环体,双重循环,/#include main() int i,j; for(i=1;i10;i+) printf(“ ”); /输出几个空格,使九九表居屏幕中间 for(j=1;j=i;j+) /输出第I行的九九表 printf(“%d*%d=%2d ,i,j,i*j); pri
31、ntf(“n”); ,例: 输出九九表,4.2.2break语句和continue语句,辅助控制语句 break语句 功能:在循环语句和switch语句中,终止并跳出循环体或开关体 说明: break只能终止并跳出它所在的最内层的结构 break不能用于循环语句和switch语句之外的任何其它语句之中,例4.24 :输出圆面积,半径从110,面积大于100时为止。,#define PI 3.14159 main() int r; float area; for(r=1;r100) break; printf(r=%d,area=%.2fn,r,area); ,运行结果如下: r=1, area
32、=3.14 r=2, area=12.57 r=3, area=28.27 r=4, area=50.27 r=5, area=78.54,例: break举例:小写字母转换成大写字母,直至输入非字母字符,#include main() int i,j; char c; while(1) c=getchar(); if(c=a ,continue语句 功能:结束本次循环,跳过尚未执行的语句,进行下一次是否执行循环体的判断 仅用于循环语句中,#include void main() int n,i=0; for (n=101; n150;n+) if (n%3=0) continue; prin
33、tf(%d, n); i+; if (i%10=0) printf(n); printf(n); ,运行结果如下: 101, 103, 104, 106, 107, 109, 110, 112, 113, 115, 116, 118, 119, 121, 122, 124, 125, 127, 128, 130, 131, 133, 134, 136, 137, 139, 140, 142, 143, 145, 146, 148, 149,例4.25 把大于100且小于150的不能被3整除的整数输出。,例: 求输入的十个整数中正数的个数及其平均值,/#include main() int i,
34、num=0,a; float sum=0; for(i=0;i10;i+) scanf(%d, ,功能:无条件转移语句 说明: 不能用整数作标号 只能出现在goto所在函数内,且唯一 只能加在可执行语句前面 限制使用goto语句,goto语句及用goto构成循环 goto语句一般格式:,goto 语句标号; . 标号:语句;,例 用if 和goto语句构成循环,求,/#include main() int i,sum=0; i=1; loop: if(i=100) sum+=i; i+; goto loop; printf(%d,sum); ,例: 从键盘输入一组数据,以0结束输入,求数据和,
35、/#include main() int number,sum=0; while(1) scanf(%d, ,程序举例,分子:1,-1,1,-1 分母:1,3,5,7,.,例 求Fibonacci数列:1,1,2,3,5,8,的前40个数,例 判断m是否素数,#include #include void main() int m,k,i; scanf(“%d”, ,方法一:,#include #include void main() int m,k,i,loop=1; scanf(“%d”, ,方法二:,例 译密码,例如 Hello,world! 译成密码:Lipps,asvph!,#incl
36、ude void main() char c; int i, j; float s=0; for (c=A;c=Z;c+) for (i=1;i80;i+) /*从屏幕的左边逐步走向屏幕的右边 */ printf(%c, c); for (j=1;j10000;j+) s=s+i*3/4; /* 起延时作用 */ printf(b); /* 注意:b后面有一个空格 */ printf(r); ,例4.28 将26个英文字母分别从屏幕的左边出现逐步走向屏幕的右边。,#include void main() int c, digit=0, space=0, other=0; printf(Please input a string:n); while (c=getchar()!=n) if (c=0 ,例4.29 统计输入的一行字符中数字、空白和其它字符的个数。,运行情况如下: Please input a string: ad9#$w45# digit=3, space=2, other=6,作
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024沙盘制作合同
- 2024机器设备修理合同范文
- 2024建筑工程施工扩大劳务分包合同
- 2024影视剧聘用未成年演员合同
- 《微喜帖用户指南》课件
- 深圳大学《中国法律思想史》2023-2024学年第一学期期末试卷
- 深圳大学《药理学实验》2022-2023学年第一学期期末试卷
- 泵站管理员合同(2篇)
- 副高职称评审述职报告(13篇)
- 核电站拆迁协议书(2篇)
- NB-T33004-2013电动汽车充换电设施工程施工和竣工验收规范
- 2024版劳动合同合同范本
- 古希腊文明智慧树知到期末考试答案章节答案2024年复旦大学
- 小学数学一年级上册数学试卷可直接打印
- 2024年中国邮政集团有限公司校园招聘考试试题参考答案
- DZ∕T 0258-2014 多目标区域地球化学调查规范(1:250000)(正式版)
- 消防工作协作与配合总结
- 《新疆工程勘察设计计费导则(2022版)》
- 历史与当代珠宝设计风格的传承与演变
- 小学作业设计比赛评分标准
- 2024年电商直播行业现状及发展趋势研究
评论
0/150
提交评论