《C语言ppt课件(精华版).ppt》由会员分享,可在线阅读,更多相关《C语言ppt课件(精华版).ppt(628页珍藏版)》请在三一办公上搜索。
1、计算机基础教学系列课程,C语言程序设计,课程性质: 大学生公共基础课程 (必修课) 学时: 讲课 34课时; 实验 64 (课内32/课外32) 学分: 2学分总评成绩 = 平时成绩 40%+ 期末成绩 60% 平时成绩: 成绩1(作业、考勤10%) + 成绩2(单元测验15%) + 成绩3(实验报告15%)期末成绩: 期末理论机考60%,C 语言程序设计,第一章 C语言的发展、特点与程序结构 第二章 基本数据类型、运算符和表达式第三章 基本语句与顺序结构第四章 选择结构第五章 循环结构第六章 数组第七章 函数第八章 指针第十章 结构体第十二章 文件,C 语 言 程 序 设 计,推荐参考书:
2、谭浩强主编程序设计(第二版) 北京:清华大学出版社,第一章 C语言的发展、特点与程序开发基本知识,1.1 C语言的发展与特点 1.2 程序设计的基本方法 1.3 算法的概念及其表示1.4 C语言的基本结构 1.5 应用程序的开发步骤和运行过程,下一章,目 录,习题,C语言是一门优秀的程序设计语言C语言是在1973年由美国贝尔实验室开发的。 1983年, ANSI为C语言制定了新的标准, 称为ANSIC, 并于1989年最终完成。 目前使用较多的版本有ANSI C, Borland C, Turbo C, Microsoft C/C+ , Visual C+等。,C语言的发展,WUCC,C语言是
3、结构化程序设计语言功能强大,具有丰富的数据类型及运算符。简洁紧凑,使用方便灵活。C语言具有自我扩充能力C语言具有汇编语言的功能可移植性好,WUCC,C语言的特点,程序的概念程序是计算机解决问题所需的一系列指令的集合。著名计算机科学家Nikiklaus Wirth 提出了 “ 算法数据结构程序 ”的公式 程序就是在数据的某些特定的表示方式和结构的基础上,对抽象算法的具体描述。,1.2 程序设计的基本方法,程序数据结构算法程序设计方法语言工具数据结构是数据的类型和数据的组织形式。算法是为解决一个问题而采用的方法和有限的步骤。程序设计方法确定语言和编程环境,WUCC,面向过程的程序设计,所谓面向过程
4、的程序设计, 是指利用面向过程的语言工具 (如Pascal、Fortran和C语言等)进行程序开发的各项活动。,优点:编程简单、结构性强、可读性好; 遵循这种结构的程序只有一个入口和一个出口。缺点:存在数据与程序模块的分离和程序的可重用性差等问题。,WUCC,面向对象的程序设计,Program Design in C Language,面向对象的程序设计将一些新的理念和结构化程序设计中好的思想相融合,提供了一种全新的程序设计方法。,1.3 算法及其表示,算法的特性有穷性 一个算法的操作步骤应当是有限的;确定性 算法中的每一个步骤应当有确定的意义,不能 有二义性;有效性 算法中的每一个步骤应当正
5、确、可行, 并且能 有效地执行;有零个或多个输入 执行算法时需要从外界获取的信息;有一个或多个输出 执行算法后应当得到正确的结果。,算法举例,【例1.1】输入三个数,然后输出其中最大的数。 (1) 输入变量 x,y,z的值 (2) 比较x和y, 如果xy, 则x送max; 否则y送max。 (3) 比较max与z, 如果 z max, 则将z送max。 (4) 输出max, max 即为最大数。,算法,对同一个问题, 算法是不唯一的, 例如:求和 1+2+3+100 (1) =(1+2)+3)+4)+ +100 ) (2) =(1+100)50 一个好的算法应该是: 正确、易读、效率高。,算法
6、的表示方法,常用的算法描述方法有: 自然语言描述、伪代码、流程图、N-S图、PAD图等。 1. 自然语言 就是用人们日常使用的语言来描述或表示算法的方法。,英语和程序设计语言混合使用称为伪代码。 Begin 算法开始 input x, y, z if xy then max=x else max=y if zmax then max=z print max end 算法结束,2. 用伪代码表示算法,用一些图框和方向线表示算法的图形表示法。特点: 直观形象,易于理解,便于检查和交流。常用流程图符号及含义如下:,3. 用流程图表示算法,流程图:,【例1.1】对任意给定的三个整数 x,y,z, 求出
7、其最大值。,例: 对任意给定的三个整数 x,y,z, 求出其最大值。,4. 用N-S流程图表示算法,结构化程序设计,C语言是结构化程序设计语言, 有三种基本结构。 顺序结构 选择结构 循环结构 实践证明, 任何复杂的算法都可以用这三种基本结构来描述。,程序设计的目标在正确的前提下, 其重要性排列次序依次为: 可读、可维护、可移植和高效。,顺序结构,矩形框 用于表示顺序结构。执行时按语句的先后顺序执行。先执行语句A, 再执行语句B。,顺序结构的流程图,顺序结构的N-S图,选择结构(分支结构),根据条件的真或假选择执行不同的操作内容。当条件成立执行语句A,否则执行语句B。,选择结构的流程图,选择结
8、构的N-S图,循环结构,(1) 当型 (while 型循环 ) 当条件成立, 执行循环体, 否则跳出循环体。,L形框用于表示循环结构,(2) 直到型循环 (do-while型循环 ),首先执行循环体, 若条件不成立继续执行循环体, 直到条件成立为止。,【例1.2】在屏幕上显示一行文字“Welcome to C!”。,#includevoid main( ) /*定义主函数*/ printf(“Welcome to C!n”) ; 程序运行结果: Welcome to C!,函数(Function)C程序包含一个或多个函数, 其中必须有一个 main( )圆括号指示一个函数 包含函数体, 表示
9、main 函数结束,printf(“Welcome ”) ;printf(“to C!n”) ;,printf(“WelcomentonC!n”);,程序运行结果: Welcome to C!,程序运行结果: Welcome to C!,注释/* 文本 */ 或/ 不被执行以提高程序的可读性,语句(Statement)必须以 ; 结尾格式输出函数printf( )。调用标准函数, 显示引号中的内容。,#include void main( ) int a, b, sum ; /声明部分, 定义变量类型 a=123; b=456; /执行部分, 赋值语句 sum=a+b; /执行部分, 赋值语句
10、 printf(“sum=%dn”, sum); /执行部分,输出语句 程序运行结果: sum=579,赋初值,计算,输出,定义变量,【例1.3】求两个整数的和,函数体包括变量说明部分语句执行部分,/文件包含预处理命令 /将标准输入输出头文件包含到源程序中,#include void main( ) int a, b, c ; /定义变量类型 printf(“input two numbers:n”);/提示 scanf(“%d,%d”, ,int max(x,y)int x, y; int z ; if (xy) z=x ; else z=y ; return(z);,【例1.4】求两个数中
11、的较大值,程序由两个函数组成: main 函数和max 函数。,运行程序 屏幕显示提示信息; 键盘输入a、b的值; 屏幕显示c的值。,input two numbers:123,456 max=456,一个C程序由一个或多个函数组成, 其中必须有一个主函数main( )。程序执行时总是从主函数开始,main( )可以置于程序的任何位置。程序中需有预处理命令(如 #include ),预处理命令通常放在程序的最前面。分号是C语句结束的标志, 每个语句和数据定义后必须有一个分号。预处理命令、函数头和花括号“”之后不能加分号。,1.4.2 C语言程序基本结构,C程序书写灵活,一行可以写几个语句, 一
12、个语句可以写在多个程序行上。,#include void main( ) int a, b, sum ; a=123; b=456; sum=a+b; printf(“sum=%dn”,sum); ,C语言本身没有输入输出语句, 输入输出的操作是由库函数 scanf( ) 和printf( ) 等函数完成的。,1.4.2 C语言程序基本结构,C程序严格区分大小写。一般变量、语句等用小写字母书写;符号常量等用大写字母书写。标识符、保留字之间必须至少加一个空格以示分隔。,函数,C语言的函数有两种: 标准库函数和用户定义的函数。,用户自定义函数,可有可无,数目不限。 如例1.4中的 int max(
13、int x , int y)C语言提供的库函数, 如输出函数printf( )和输 入函数 scanf( )。,函数定义: 函数头+函数体 函数头: 说明函数的类型、名字、参数及参数的类型。 int max( int x, int y ),#include void main( ) int a, b, sum ; a=123; b=456; sum=a+b; printf(“sum=%dn”, sum); ,函数体,函数头,函数体: 由“ ”括起,包括变量声明和执行部分。,函数定义,1.4.3 C语言的字符集、关键字和标识符,字符集: C语言允许使用字符的集合字符集的组成: 26个小写字母 a
14、bcdefghi . z 26个大写字母 ABCDEFG .Z 10个数字 09 其他符号 + - * / = , . _ : ; ? ” | & ! %# ( ) 空格(SPACE) 制表符(Tab),C语言的关键字,关键字: C语言中预定的具有特定含义的词, 也称 保留字。共有32个。 分四类:类型说明: int , long,float,。语句定义: ifelse, while, for 。存储类: auto,static,。长度运算符: sizeof,标识符,标识符: 用来标识变量、符号常量、数组、函数的名字。组成:只能由英文字母、数字和下划线组成。第一个字符不能是数字,只能是字母或下
15、划线。VC6.0中有效长度为1255个字符。例如: x,m1,average,k123,_1, 5AN, WA-11, a lot , $11, , , , ,注意:,标识符严格区分大小写 例如: ABC ,abc 是不同的标识符不能和C语言的关键字、用户定义的函数名以及系统库函数同名。C的“.h”头文件中经常使用以下划线开头的内部变量名,因此用户最好避免使用这类标识符。 取名应尽可能见名知意。如: alfa, aver, pi, bata 等。,例: 以下各标识符组中, 合法的用户标识符分别为:,(1) A) PAd B) scanf C) void D) 4a P#D a10 max te
16、mp(2) A) b-b B) CCP C) hiy D) _isw abc float INT(3) A) _0123 B) del_word C) list D) keep% ssiped signed *jer wind,分隔符,分隔符分隔符主要有逗号和空格两种。逗号用于分隔变量或参数, 空格用于分隔单词(在关键字和标识符之间必须用空格分隔)。例如: int a, b, c; max(x, y, z),1.5 应用程序的开发过程,1.5 应用程序的开发过程,编辑器,file.cfile.cpp,编译器,file.obj,连接器,file.exe,Libraries,CPU,装载程序,建立
17、、修改、保存源文件,生成目标文件,生成可执行文件,运行可执行文件,1.5 应用程序的开发过程,在Visual C+ 6.0 环境下, 开发和运行程序的步骤如下: 1. 启动VC “开始”“程序”“Microsoft Visual C+ 6.0” 即可启动 VC6.0。 2. 编辑、建立源文件。 3. 编译、连接和运行源程序。,习题,1. 一个C语言程序是由组成 a) 主程序 b) 子程序 c) 函数 d) 过程2.一个完整的C语言的程序 a) 至少包含一个主函数 b) 至少包含一个主函数与一个子函数 c) 必须由一个主函数与一个以上的子函数组成 d) 必须由一个主函数与一个子函数组成,习题,3
18、. C语言程序的执行总是从。 a) main函数的入口开始 b) 编译预处理命令开始 c) 源程序的第一个函数开始 d) 源程序的第一行语句开始,习题,4.在C语言的源程序中,主函数的位置 。 a) 必须在源程序的最后 b) 任意 c) 必须在源程序的开头5.一个函数一般由两部分组成,它们分别是和。6.函数体使用_符号开始,使用_符号结束。,函数头,函数体,习题,7. C程序的每条语句的结束标志是_符号。8. 在C程序中, 注释以_符号开始,使用_符号 结束。 9. 算法是 _。10.表示算法的常用方法有 _、_、_等。11.结构化程序的三种基本结构是 _、_、_。,;,/*,*/,解决某一问
19、题所采取的方法和步骤,自然语言,流程图,伪代码,顺序结构,选择结构,循环结构,12. 判断下述说法是否正确。如不正确, 说明理由。,a) printf 函数总是从新行的起始位置开始打印。b) 计算机会把 /*和*/之间的注释文本打印到屏幕上。c) 所有的变量在使用前都必须予以声明。d) C语言认为变量 number 和 NuMbEr 是相同的。e) 声明语句可放在函数体中的任何位置。f) 打印三行输出的C语言程序必须用三条 printf 语句。g) printf 函数的格式控制串中使用转义字符 n 会把光标定位到屏幕上下一行的开始位置。,2.1 数据与数据类型2.2 常量、变量和标准函数2.3
20、 基本运算符及其表达式,第二章 数据类型、运算符和表达式,下一章,上一章,目 录,习题,整型: 包括有、无符号的基本整型、短整型、长整型实型: 包括单精度实型、双精度实型 float,double字符型: 用于表示和存储ASCII字符。 char,2.1 数据类型,是C语言数据类型的基本型,其值不可再分解为其他类型。,一种特殊的数据类型,其值为某个量的内存地址。,一种无返回值函数的数据类型。void,用新的类型名替代已有类型名使用。用typedef定义,一种由单种或多种数据类型构造而成的数据类型。数组结构共用体枚举类型,C语言的基本数据类型,2.2 常量、变量和标准函数,2.2.1 常量2.2
21、.2 变量2.2.3 标准函数,下一节,第二章,目 录,习题,2.2.1 常量,常量 在程序执行期间其值保持不变的量C语言有以下几种类型的常量:整型常量实型(浮点型)常量字符常量字符串常量,有三种形式:十进制整数:八进制整数: 由数字 0 开头十六进制整数: 由前缀 0 x 或 0X 开头,1. 整型常量,如: 014 -011 0177777,如: 0 x11 0XAFBDE 0X00FFH,如: 11, -13 , 0 , 65535 , 1,000 21/3 104 54. 10*3 01 9 9,整数又可分为:,长整型整数: 用后缀 L/l 表示。 012L , 65536L , 0X
22、CL无符号整数: 用后缀 U/u 表示。 017u, 0 xfdbU无符号长整数: 用后缀 UL/ul 表示。 15uL,实型常量又称实数, 指带有小数部分的数。C语言中的实数是以十进制表示的, 有两种表示形式:十进制小数形式: 由数字、数符和小数点组成。 例: 0.123, .123, 123. ,0.0 , -2.5,,指数形式: 又称科学记数法。用E(或e)表示以10为底的指数。 如: 100000000 1108 1E+8 0.0000125 1.2510-5 1.25E-05,0.9110-3 0.91E-03,尾数部分,指数部分,字母E/e前必须有数字, 而E后面的阶码必须为整数。
23、,2. 实型常量浮点数,例: 下列不合法的指数形式:,单独的小数点和单独的指数部分 如: . E-5 E10 阶码只能是整数,不能带小数点。 如: 1234E1.5 2.E 6.5e (2*3)E-3 5*E41012不能写成 E12,必须写成:,3. 字符常量,字符常量: 是用单引号括起来的一个字符 如: a, A, 9, +, ?, 合法 “a”, 99999, 非法在内存中, 字符常量以ASCI I码存储, 一个字符占一个字节。由于字符常量是按整数存储的, 可以像整数一样在程序中参与相关的运算。如: a 3 2 ; / 执行结果9 7- 32 = 65 9 9; / 执行结果5 7- 9
24、 = 48,以“”开头的字符序列, 有特定的含义。 如: 表示输出一个反斜杠符 ” 表示输出一个双引号 ddd (ddd表示八进制的ASCII码) xhh (hh表示十六进制的ASCII码)例: n (回车换行) 12 xa A 101 x41 注: 0或000是代表ASCII码为0的字符,即空字符(NULL), 表示整数0。,转义字符,【例2.1】转义字符的应用,#include void main( ) printf(“atbncbd100 x40n”); ,abd,输出到显示屏,字符串常量: 用一对双引号括起的字符序列。例: “CHINA”, “a”, “$12.5”, “”, “wx5
25、3np103q” 字符串长度: 字符串中所有字符的个数系统自动在每个字符串的末尾加上一个空字符NULL, 即0 作为字符串的结束。0是一个ASCII码为0的字符。 例: “CHINA”在内存中所占的字节为:,4. 字符串常量,字符常量由单引号括起来, 字符串常量由双引号括起来。,字符串常量和字符常量的主要区别:,字符常量只能是单个字符,字符串常量可以含有多个字符。字符常量占一个字节, 字符串常量占的字节数等于字符个数加1。比较: A与”A”的区别,若输出的字符串中含双引号(”), 则要使用转义字符(”)。例:printf(“he said “ I am a student.”n”);输出: h
26、e said “ I am a student.”,5. 符号常量,符号常量: 用标识符表示的常量格式: #define 标识符 常量功能: 用该标识符代表后面的常量值例: #define PI 3.1415926 #define STAR *,预处理命令#define也称为宏定义, 一个#define命令只能定义一个符号常量, 用一行书写, 不用分号结尾。,#include #define PI 3.1415926 /用预处理命令定义符号常量 void main( ) float r, area, l ; /定义变量类型为实型 scanf(“%f”, ,【例2.2】求半径为r的圆面积和圆周长
27、,说明:符号常量名习惯用大写字母表示该命令通常放在文件头在程序中, 符号常量不允许重新赋值。例: #define PI 3.1415926 PI=5.6; 或 scanf( “%f ”, ,5. 符号常量,2.2.2 变量,变量概述整型变量实型变量字符型变量变量的初始化,变量概述,变量: 在程序执行期间其值可以改变的量变量在使用之前必须被声明每一个变量有名字,类型,长度和值。对变量赋值过程是“覆盖”过程,用新值去替换旧值。从内存中读出变量的值,该变量保持不变。,90,x = 90;,printf(“%d”, x);,定义变量的形式: 类型说明符 变量名表; 例: int a, b; /*定义两
28、个整型变量a和b*/ char c; /*定义字符型变量c*/ float f1, f2; /定义单精度实型变量f1和f2,变量概述,变量类型(type),变量名(name)是一个标识符,1. 整型变量,用来存放整型数据的变量,整型变量的分类表,与操作系统、编译系统、机器字长有关。,有符号的整数 最高位是符号位,正整数在内存中以二进制原码形式存放。负整数在内存中以二进制补码的形式存放。有符号正整数 10,有符号负整数 -10,无符号整数,无符号整数的所有二进制位全部用来存放数值, 不能存放负数。 无符号整数65535u,例: 求50的三次方,#include void main( ) shor
29、t int x; x=50*50*50; printf(“%dn”, x ); 程序运行结果为: -6072 (错),将以上程序改为:,#include void main( ) int x ; x=50*50*50 ; printf(“%dn”, x) ;运行结果:125000,因此,在定义整型变量时,要注意数据类型允许的数值范围。,用来存放实型数据的变量分单精度型、双精度型和长双精度型三类,2. 实型变量,#include void main( ) float f ; / f为单精度实型变量 double d ; / d为双精度实型变量 f=33333.33333 ; d=33333333
30、333333.333333; printf(“f=%fnd=%fn”, f, d); 输出结果: f=33333. 332031 d=33333333333333.332000,【例2.3】实型变量的使用,f;,3. 字符变量,用来存放字符常量的变量例: char c1, c2, c3 ; c1=A; c2=n; c3=97; 每个字符变量分配一个字节用于存放一个字符。 (存放的是字符的ASCII码值),字符数据与整型数据可相互赋值,直接运算。可以把字符变量按整型量输出, 也允许把整型量按字符量输出。,#include void main( ) int a=b; /给一个整型变量赋一个字符值
31、char c1=97; /给一个字符变量赋一个整数值 c1=c1-32; / 将小写字母转换为大写字母 printf(“%d %dn”, a , c1); printf(“%c %cn”, a , c1);,输出结果: 98 65 b A,【例2.4】字符型变量的使用,注意:,只能将一个字符常数赋给一个字符变量, 不能把一个字符串常量赋予字符变量。 例: char c=“abc” ; 在C语言中没有字符串变量 (但可以用一个字符数组来存放一个字符串常量),4. 变量的初始化,在说明变量的同时给变量赋初值格式: 类型说明符 变量 = 常数 ;例: int a=5; /定义并初始化 char c1
32、=a, c2=B ; double area, r=23.e-2 ; int x=10, y=10, z=10 ; /不能写成int x=y=z=10;,int a;a=5; /赋初值,2.2.3 标准函数,C编译系统提供的库函数包括: 输入输出函数、数学函数、字符和字符串函数等。,数学函数,x为弧度, double x, double sin(x)cos(x),sin(x)cos(x)exp(x)log(x)log10(x)fabs(x)pow(x, y)sqrt(x),area=s(s-a)(s-b)(s-c) , s=(a+b+c)/2,#include #include ,【例2.5】
33、求三角形面积,/预编译命令, 将系统提供的数学函数/作为头文件包含到用户源文件中,void main( ) double a, b, c, s, area; scanf(“%lf,%lf,%lf”, 运行,2.3 运算符和表达式,2.3.1 算术运算符与算术表达式2.3.2 不同数据类型的转换与运算2.3.3 关系运算符与关系表达式2.3.4 逻辑运算符与逻辑表达式2.3.5 条件运算符与条件表达式2.3.6 赋值运算符与赋值表达式2.3.7 逗号运算符与逗号表达式,2.3 基本运算符及其表达式,1. 基本算术运算符,算术运算符用于各类数值运算。包括基本算术运算符、自增运算符、自减运算符。下表
34、为基本算术运算符。,1,在C语言中,规定了运算符的优先级和结合性。,优先级: 语言中,运算符的优先级共分为15级。1级最高, 15级最低。表达式求值时, 先做优先级高的操作。 如: d=a+b*c ; 当运算符的优先级别相同时,运算次序由结合性决定。结合性: 左结合性(先左后右)例: d=3*5/4; 右结合性(先右后左)例: d=a=3;,运算符, 整数相除截去余数, 此运算为整除。 5/2=2 (2.5) 1/3+1/3+1/3=0 对于浮点数则为通常意义的除法 5.0/2.0=2.5 1./3+1./3+1./3=1,% 模运算符,用于计算两个数相除后得到的余数。 如: ab 求a除以b
35、以后得到的余数。运算对象只能是整型量, 其结果也是整型量。 如: 5%2=1 3%3=0 3%5=3 A%2=1 3.0+10.0%5 所得结果的符号与运算符左侧操作数的符号相同,-5%2=-1 5%-2=1,2. 自增、自减运算符,例: x = 10 ; y = +x ; 此时, y = 11若: x = 10 ; y = x+ ; 则 y = 10 在这两种情况下, x都被置为11。,K=3; j=5; i=3;m=(+k)*j ;n=(i+)*j ;,例:,m= k=,20,4,n= i=,15,4,【例2.7】自增、自减运算符的使用。,#include void main( ) int
36、 i=6, a, b; printf(“%dn”, +i ); printf(“%dn”, i+ ); a=-i ; printf(“%dn”, a ); b=i-; printf(“%dn”, b ); printf(“%dn”, -i+) ; printf(“i=%dn”, i );,i = ?,7777-6,7,注意:,自增、自减运算只能用于变量, 不能用于常量和表达式。 例: i+ 为合法的运算 +6, +(a+b) 为非法的运算,自增、自减运算符是两个+或两个-的一个整体, 中间不能有空格。如果有多于两个+ 或两个-连写的情况,则编译首先识别前两个+或-为增量或减量运算符。,表达式
37、x+y 等价于 (x+)+y自增、自减运算符的运算顺序是右结合,因此对-i+应理解为: -(i+),而 (-i )+ 是非法的。 例: i=3 ; printf(“%d”, -i+); 输出:,-3,【例2.8】自增、自减运算符的使用,#include void main( ) int i, j, k ; i=1; j=1; k=i+j ; printf(“i=%d, j=%d, k=%dn”, i, j, k ); ,程序运行结果:i=2, j=1, k=2,k=(i+)+j;,由算术运算符和括号将运算对象(如常量、变量、函数等)连接起来的一个有值的式子。 例: A*2-sqrt(4.)/-
38、d (d=2)表达式求值的优先次序: ( ) 函数 +、- *、/、% +、- 高 低,3. 算术表达式, “/”号,如: (a+b)/(c+d), “*”不能省略,如: 2(a+b) 2*(a+b) 括号只能使用圆括号, 且成对出现,不能使用 和 。 如: ax+b(y+c) a*(x+b*(y+c),书写问题:, LN( -X) ,例: 将下列数学式子写成C算术表达式,log( sqrt( a+x*x )-x ), ae-st ,abs(a)*exp(-s*t ), sqrt(fabs(sin(x*3.14/180), xy ,pow(x, y),A 3*xn/(2*x-1) B 3*x*
39、n/(2*x-1) C 3*pow(x,n ) *(1/(2*x-1) ) D 3*pow(n, x) /(2*x-1),例: 与数学式子3乘以x的n次方除以(2x-1)对应的C语言表达式是_。,2.3.2 不同数据类型间的转换与运算,在C程序中, 当不同类型的量进行运算时, 要转换成同一种类型然后再进行运算。 例: 10+a+1.5-8765.1234*b转换方式: 自动转换:数据类型自动由低级向高级转换。强制转换: 将表达式的运算结果强制转换成指定的数据类型。,自动类型转换,这种类型转换由编译系统自动完成转换规则:,说明:1. 横向的箭头表示必定的转换。2. 纵向的箭头表示当运算对象 类型
40、不同时转换的方向。,例: float f=3.5; int n=6; long k=21; double ss=f*n+k/2;,强制类型转换,格式: (数据类型说明符)(表达式) 注意:强制转换属单目运算, 运算优先级为2。强制转换得到的是中间结果类型,原变量类型不变。数据类型说明符和表达式都必须加括号(单个变量除外)例: int x, y ; float z ; (float)(x+y) ; (int)z+x ; (float)(5%3); (将5%3的值转换为float型),#includevoid main( ) int x=8; float f=6.85; printf(“(floa
41、t)x=%f, x=%dn”, (float)x, x ); printf(“(int)f=%d, f=%fn”, (int)f , f );,【例2.12】强制类型转换的应用,2,%4, f );,2.3.3 关系运算(比较运算),即比较两个量的大小, 比较的结果为“真”或“假”。,例: a 3 如果a=8,则结果为“真”;如果a=1,则结果为“假”。,1. 关系运算符,2. 关系表达式,用关系运算符将两个表达式连接起来的式子。格式: 其中: 表达式1和表达式2可以是任意表达式。,例: m+n=20, 测试此关系是否成立, 成立为真,不成立为假。成 立 关系表达式的值为1;不成立 关系表达式
42、的值为0。,例: 5(4 b+3 (a=4)=(b=6) 5278,0,0,0,值为: 1,例2.13读程,#includevoid main( ) int a, b, c; a=b=c=10; a=b=c ; printf (“%d , %d , %d n”, a , b, c ) ; a= ( b=c+*2 ) ; printf ( “%d , %d , %d n”, a , b, c ) ; a= bc=100 ; printf ( “%d , %d , %d n”, a , b, c ) ; ,输出结果: 1 , 10 , 10 1 , 20 , 11 0 , 20 , 11,关系运算
43、的不足,关系表达式只能表达简单的关系,如: sum=1500 y!=z 即只能对一个条件进行测试。 而以下关系: 0 x5 则不能用关系表达式表示。 x0&x5,2.3.4 逻辑运算符与逻辑表达式,1. 逻辑运算符 C逻辑运算符,逻辑运算真值表,特点: 全真为真, 其余为假。,特点: 全假为假, 其余为真。,逻辑非!,逻辑与&,逻辑或,2. 逻辑表达式,用逻辑运算符将表达式连接起来的式子。形式: 表达式1和表达式2可以是任何表达式 如: 53&2|4-!a,逻辑表达式的值整数 1: true 0: false,判断时, 0代表“假”, 非0即表示“真” 。,将下面的条件用C语言的逻辑表达式表示
44、,例1: 1x10且x7 x=1 & x=10 & x!=7例2: y能被4整除, 但不能被100整除或y能被400整除。 y%4=0 &y%100!=0|y%400=0,运算顺序:,( )!算术运算关系运算&|赋值运算 例: 若 a=2, b=a, c=5, f=3.0 c3&86&(b=-1)6,0,1,1,0,逻辑与和逻辑或运算符具有短路能力,逻辑与: (表达式1) & (表达式2) & 只有表达式1的值为“真”时才求表达式2的值,如: x=y=-1; +x /* x=? y=? */,0,-1,短路表达式,逻辑或: (表达式1) | (表达式2) | 只有表达式1为假时才判断表达式2的
45、值 例: void main( ) int num=3; 54|(num=0); printf(“num=%dn”, num); ,输出: num=3,条件运算符: ? : 三目运算符、右结合、13级。条件表达式: ? : 执行过程:,2.3.5 条件运算符与条件表达式,例: max=(ab) ? ab;,max= ab ? ab ;,说明:,在程序中常把条件表达式的值赋给某个变量, 如: 将ch中字母转换为小写字母 char ch=getchar( ); ch=(ch=A,将x 的绝对值赋给 y y= x=0 ? x : -x ;,在条件表达式中, 各表达式的类型可以不同, 此时,条件表达式
46、值的类型为表达式2和表达式3中较高的类型。 如: xy ?11.5 条件表达式的值为浮点型,说明:,说明:,条件运算符可以嵌套, 这种嵌套是右结合的。 例: int a=15, b=20, c=25, d=30, e ; e= ab ? c : cd ? b : d ;,(,),e=30,例2.15 读程, 写出运行结果。,#includevoid main( ) int a=1, b=1, c=1; a = a+b ; b=b+c ; c = c+a ; printf(“(1)%dn”, ab ? a : b ); printf(“(2)%dn”, ac ? a- : c+); (a=b=c
47、) ? printf(“an”) : printf(“bn”); printf(“(4)%d, %d, %dn”, a, b, c ); ,运行结果:(1)2(2)3b(4)2, 2, 4,例2.16:任意输入三个数,输出最大值。,#include void main( ) int a,b,c,max ; scanf(“%d%d%d”, ,程序运行如下: 25 -7 48 最大数为: 48,(,(,),),赋值运算符分两种:简单赋值运算符: =复合赋值运算符: 如 +=、-=、*=、/=、%= 等优先级14,右结合性。赋值表达式: 由赋值运算符连接起来式子作用: 将表达式的值赋给变量,2.3.
48、6 赋值运算符和赋值表达式,简单赋值运算符为“=” ; 由“=”连接的式子为 (简单) 赋值表达式。格式: = 作用: 把右边表达式的值,赋给左边的变量。 例: k=i+-j (i=2, j=3, k的值为 ) x=(a=5)+(b=8) (x的值为 ) d=e=2.1执行顺序是: 先计算,再赋值。,4,13,1. 简单赋值运算符和赋值表达式,例: 指出下列赋值表达式的错误,-s=x+y 5=n a=a*3=2 w=3.64E2.1/5.87 cos()=a/sqrt(a*a+b*b) y=int(i) k=12.3%4 a=a+7;,赋值运算的类型转换, 规则为:,实型数据赋给整型变量时,只
49、取整数部分。 如: int i=1.5*2/2 ;,( x的值为0.000000 ),整型数据赋给实型变量时,以浮点形式取值。,( i值为1 ),如: float x=1/4+1/4+1/4 ;,字符型数据赋给整型变量时, 整型变量的高位补的数与char的最高位相同, 低八位为字符的ASCII码值。,整型数据赋给字符型时,只把低8位赋给字符变量。,如: K=A (k值为65),k: 0000 0000 0100 0001,例2-13:,void main( ) short int x=300; char y; y=x; printf(“y=%d y=%cn”, y, y ); 输出结果: y=
50、44 y=,x: 0000000100101100,y,2. 复合赋值符及表达式,复合赋值运算符是在简单赋值运算符前加双目运算符构成。 共10种: +=, -= *=、/=、%= 等。 例: c=c+3 c += 3 x*=y+7 x=x*(y+7) 设x, y, z的初始值分别为: 10, 20, 30 x+=y+=z*z x=x+(y=y+z*z) 结果为: 930 设 t 的值为5 t+=t-= t*t t=t+(t=t-t*t) 结果为: -40,例2-14,void main( ) int a, b, c; a=b=c=5; printf(”a=%d, b=%d, c=%dn”, a