




已阅读5页,还剩170页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计,主讲人:汪洋,第一章 C语言概述,C语言的发展与特点 C语言的基本程序结构 C语言程序的开发过程 C语言的基本词法 算法,1.1 C语言出现的历史背景,汇编语言依赖于计算机硬件,程序的可读性和可移植性差; 一般高级语言难以实现汇编语言的某些功能如对内存地址的操作、位操作等。,1.2 C语言的发展史,1960年 ALGOL 60; 1963年 英国剑桥大学提出CPL语言; 1967年 Matin Richards提出BCPL语言; 1970年 Ken Thompson提出B语言; 1972-1973 Dennis.M.Ritchie提出C语言; Brian W.Kernighan 和D.M.Ritchie介绍标准C; 1987年美国国家标准化协会提出ANSI C。,1.3 C语言的特点,简洁、紧凑,使用方便、灵活; 允许直接访问地址,能进行位操作; 运算符丰富; 数据类型丰富; 结构化程序语言,便于实现程序的模块化; 程序执行效率高,可移植性好。,1.4 C语言的基本程序结构,C程序是由函数构成的,每个C程序有且只有一个主函数(main),可包含若干其他函数; 每个函数由首部与函数体组成; 首部包括函数类型、函数名、函数参数(形参)、参数类型, int max(int x,int y) 函数体包括声明部分和执行部分。,main函数位置任意,但总是从main函数开始执行,在main函数中结束; C程序书写自由,每个语句后需加一个分号; 主函数可调用任何非主函数,非主函数之间可互相调用,但不能调用主函数; C语言本身没有输入输出语句; 用/*/进行注释。,1.5 C语言程序的开发过程,编辑 编译 链接,计算机只能识别和执行由0和1组成的二进制的指令,为了使计算机能执行高级语言源程序,必须先用“编译程序”把源程序翻译成二进制形式的“目标程序”,然后将该目标程序与系统的函数库和其他目标程序连接成为可执行的目标程序。,1.6 C语言的基本词法,字符集:包括大小写英文字母52个、数字10个、键盘符号33个、转义字符。 标识符:是用户自定义的一组字符序列,用来表示程序中需要辨认的对象名称,如符号常量、变量、数组、函数。 规定:,标识符是由字母或下划线开头的字母、数字、下划线组成的一串符号,最长不能超过32个字符; 大小写字母有区别,大写字母只用来定义宏名,其他都采用小写字母表示。,保留字:32个,有特殊含义,主要用于构成语句,进行存储类型和数据类型的定义,不允许用户作为自定义标识符使用; 词类:常量、变量、运算符、函数、表达示、保留字; 语句:完成特定的操作,语句的有机组合序列完成指定的功能;,语句的种类,赋值语句; 函数调用语句; 表达式语句; 流程控制语句; 复合语句; 空语句;,1.7 算法,著名计算机科学家沃思提出公式: 程序=数据结构+算法 数据结构:对数据的描述即指定数据的类型和数据的组织形式; 算法:对操作的描述即操作步骤。,1.7.1 简单算法举例,判定2000-2500年中的每一年是否闰年。 设定y为被检测的年份。算法如下: S1:2000=y S2:若y不能被4整除,则输出y“不是闰年”,然后转至S6 S3:若y能被4整除,不能被100整除,则输出y“是闰年”,然后转至S6 S4:若y能被100整除,又能被400整除,输出y“是闰年”;否则输出y“不是闰年”,然后转至S6 S5:输出y“不是闰年” S6:y+1=y S7:当y2500,算法停止;,1.7.2 算法的特点,有穷性; 确定性; 有零个或多个输入; 有一个或多个输出; 有效性,1.7.3 算法的表示,用流程图表示算法; 用伪代码表示算法; 用计算机语言表示算法。,第二章 C语言的数据类型、运算符与表达式,C语言的数据类型; C语言的运算符与表达式;,2.1 C语言的数据类型,数据类型,2.2 常量,在程序运行过程中,其值不能被改变的量称为常量。 C语言中规定的常量类型有以下五种:整型常量、实型常量、字符常量、字符串常量和符号常量。,2.2.1 整型常量,1. 整型常量的表示方法: 十进制整数: 无前缀,数码取值为09,如123,-456。 八进制整数: 前缀为0,数码取值为07,如0123,-011 。 八进制数与十进制数的转换方法如下: (0123)8 =1* 82+2*81+3*80=64+16+3=(83)10,十六进制整数: 前缀0X或0x,数码取值为09,AF或af,如0x2A,-0x12。 十六进制数与十进制数转换方法: (-0x12)16=-(1*161+2*160)=-(16+2)=(-18)10 2.整型常量的后缀: 加后缀L或l,表示长整型数。 加后缀u,表示无符号数。,2.2.2 实型常量,实型常量即实数又称为浮点数,C语言中实数只采用十进制,有两种表示形式: 小数形式:由数码09和小数点组成(注意必须有小数点),如.123,-123.4567; 指数形式:由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数),如 -2.1e2,2.1e-2。,2.2.3 字符常量,C语言中,字符常量是用单引号括起来的单个字符,如a,$等。 转义字符是一种特殊形式的字符常量,它是以一个“”开头的字符序列。,表2.1转义字符及其含义,例2.1转义字符的使用,main() printf(“abctderftgn”); printf(“htibbjk”); ,例2.1结果,程序运行后在打印机上得到以下结果: fabcgde hjik 注意在显示屏上最后看到结果以与上述打印结果不同,是: fgde hjk,2.2.4 字符串常量,C语言中,字符串变量是由一对双引号括起来的字符序列,如“China”,“$3.232”。,注意:不要将字符常量与字符串常量混淆。,字符常量与字符串常量的区别,字符常量是由单引号括起来的,字符串常量是由双引号括起来的; 字符常量只能是单个字符,字符串常量则可是零个或多个字符; 可把一个字符常量赋予一个字符变量,但不能把一个字符串变量赋予一个字符变量,C语言中没有相应的字符串变量,可用字符数组来存放字符串常量; 字符常量占一个字节的内存,字符串常量占的内存字节数等于字符串中字节数加1,最后一个字节存放字符0作为字符串结束标志。,2.2.5 符号常量,C语言中,可用一个标识符来表示一个常量,称为符号常量又称为宏定义,使用前须先定义,其定义规则为: #define 标识符 常量,例2.2 符号常量的使用,#define PRICE 30 main() int num,total; num=10; total=num*PRICE; printf(“total=%d”,total); ,使用符号常量的好处: 含义清楚; 在需要改变一个常量时能做到“一改全改”;,2.3 变量,变量是指在程序运行中其值是变化的量。 一个变量应该有一个变量名,在内存中占据一定的存储单元,在该存储单元中存放变量的值。,图2.1,语言中,要求对变量作强制定义,即“先定义,后使用”。 便于发现错误; 为每一个变量指定确定类型,在编译时就能为其分配相应的存储单元。,整型数据在内存中的存储方式,整型数据在内存中是以二进制形式存放的。若定义了一个整型变量i: int i=10; 图3.2(a)是数据存放的示意图,图3.2(b)是数据在内存中实际存放的情况;,i,10,(a),i,(b),图2.2,实际上,整型数值是以补码表示的。一个正数的补码与其原码相同,求负数的补码方法:将该数的绝对值的二进制形式按位取反再加1。例如求-10的补码:,10的原码,取反,再加1得-10的补码,.3.1 整型变量,有符号基本整型signed int 有符号短整型 signed short int 有符号长整型 signed long int 无符号基本型 unsigned int 无符号短整型 unsigned short int 无符号长整形 unsigned long int,.整型变量的分类:,表2.1整型数据的所占的内存字节数与取值范围,2.整型变量的说明,类型说明符 变量名标识符,变量名标识符,.; 如:int a,b,c; unsigned short x,y;,例2.3 整型变量的定义和运算,见教材P34例2.3,2.3.2 实型变量,单精度型 float 占4个字节内存,提供7位有效数字, 双精度型 double 占8个字节内存,提供16位有效数字。 整数没有误差,实数有精度,有误差,提供6位小数,7位有效数字。,2.实型变量的说明,格式和书写规则同整型变量说明相同, 如:float s,t; double h,k;,例2.4实型数据的舍入误差,main() float a,b; a=123456.789e5; b=a+20; printf(“%f,%f”,a,b); ,结果: 12345678848.000000,12345678848.000000,误差原因分析,b的理论值应是12345678920,而一个实型变量只能保证的有效数字是7位有效数字,后面的数字是无意义的,并不准确表示该数,从结果看出,把20加在后几位上,是无意义的,应当避免将一个很大的数与一个很小的数直接相加减,否则就会“丢失”小的数。与此类似,用程序计算1.0/3*3的结果并不等于1。,2.3.3 字符变量,字符变量用来存放字符常量,只能存放一个字符,占用1个字节内存。 字符变量定义如下: char c1,c2;,1. 字符数据在内存中的存储,将一个字符常量放到一个字符变量中,不是把该字符本身放到内存单元中,而是将该字符的相应的ASC 代码存放在存储单元中,如字符a的ASC 代码为97 ,b为98,,97,98,c1,c2,c1,c1,图2.3,在内存中,字符数据以ASC码存储,它的存储形式与整数存储形式类似,C语言允许对整型变量赋以字符值,也允许对字符变量赋以整型量。在输出时,允许把字符变量按整型量输出,也允许把整型变量按字符型量输出。 注意:当整形变量按字符型量处理时,只有低八位参与处理。,例2.5 向字符型变量赋以整型值,main() char c1,c2; c1=97; c2=98; printf(“%c,%cn”,c1,c2); printf(“%d,%dn”,c1,c2); 结果: a,b 97,98,2. 补充,Turbo C将字符变量中的最高位作为符号位,也就是将字符处理成带符号的整数,即signed char型。它的取值范围是-128127。如果使用ASC码为0127间的字符,由于字节中最高位为0,因此用%d输出时,输出一个正整数。如果使用ASC码为128255间的字符,由于在字节中最高位为1,用%d格式符输出时,就会得到一个负整数。例如: main() char c=130;printf(“%d”,c); 得到-126。如果不想按有符号处理,可以将变量定义为unsigned char类型,这时其取值范围是0255。signed char和unsigned char 相仿,但它只有一个字节。,例2.6,main() char c1=130; unsigned char c2=130; printf(“c1=%d,c2=%dn”,c1,c2); ,结果:c1=-126,c2=130,2.3.4 变量赋初值,程序中常需要对一些变量预先设置初值。C语言允许在定义变量的同时使变量初始化,如 int a=3; float f=3.56; char c=a;,也可以使被定义的变量的一部分赋初值,如: int a,b,c=5; 如果对几个变量赋予初值3,应写成 int a=3,b=3,c=3; 不能写成:int a=b=c=3; int a=3; 相当于: int a; a=3;,2.4 运算符和表达式,运算符是一些特定的符号,它用来对数据进行某些特定的操作; 运算对象(操作数)是用来进行运算的数据,包括常量、变量等; 表达式是用运算符将运算对象连接起来的式子。 如1+2,1和2为运算对象,而1+2就是表达式。,2.4.1 运算符种类、优先级和结合性,算术运算符 用于各类数值计算。运算符有:加(+)、减(-)、乘(*)、除(/)、求余(或称模运运算,%)、自增(+)、自减(-)。 关系运算符 用于比较运算。运算符主要有:大于()、小于(=)、小于等于(=)和不等于(!=)。,1. 运算符的种类,逻辑运算符 用于逻辑运算。运算符有:与(&)、或(|)、非(!)。 位操作运算符 参与运算的量,按二进制位进行运算。运算符有:按位与(&)、按位或(|)、取反()、按位异或()、左移()。 赋值运算符 用于赋值运算。赋值运算符有:简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)、复合位运算赋值(&=,|=,=,=)等三类。,条件运算符 是一个三目运算符,用于条件求值。运算符有:(?:)。 逗号运算符 用于把若干表达式组合成一个表达式。运算符有:(,)。 指针运算符 用于取内容(*)和取地址(&)两种运算。 求字节运算符 用于数据类型所占的字节数(sizeof)。,强制类型转换运算符 可以利用强制类型转换运算符将一个表 达式转换成所需类型。其一般形式为: (类型名)(表达式) 如(double)a; (int)(x+y); (float)(5%3) 其他运算符 其他运算符有:括号()、数组下标、成员运算符.和用指针访问结构体成员的指向运算符-。,2.运算符的运算优先级,C语言中,运算符的运算优先级共分为15级。1级最高,15级最低。在表达式中,优先级较高的先于优先级低的进行运算。 如求表达式x+y*z的值: y的值左侧为加号,右侧为乘号,而乘号优先于加号,因此相当于x+(y*z),即先进行乘法运算,然后再进行加法运算。,3. 运算符的结合性,C语言的运算符不仅具有不同的优先级,还有结合性的问题。在表达式的运算过程中,各运算对象参与运算的先后顺序不仅要遵循运算符优先级别的规定,还要受运算符结合性的制约,当一个运算对象两侧的运算符优先级别相同时,需按运算符的结合性来处理,以便确定是自左向右进行运算还是自右向左进行运算。,C语言中运算符的结合性分为两种:即左结合性(自左向右)和右结合性(自右向左)。 例如:算术运算符就是左结合性的运算符 表达式:x-y+z,运算对象y的左侧运算符“-”和右侧运算符“+”优先级相同,应按结合性来进行自左向右的运算,即先执行x-y运算,再执行+z的运算。 赋值运算符是右结合性的运算符 表达式:x=y=z,由于赋值运算符“=”的右结合性,所以先执行y=z运算,再执行x=(y=z)运算。,表2.2 C语言各运算符的优先级别与结合方向,续表,同一优先级的运算符优先级别相同,运算次序由结合方向决定; 不同的运算符要求有不同的运算对象个数如+(加)和-(减)为双目运算符,要求在运算符运算符两侧各有一个运算对象(如3+5、8-3等);而+(自增)和-(负号)运算符为单目运算符,只能在运算符的一侧出现一个运算对象(如-a、i+、-i、(float)i、sizeof(int)、*p等);条件运算符是C语言中唯一的三目运算符,如 x ? a: b。 从上述表中可以大致归纳出各类运算符的优先级:,表2.2说明:,特殊运算符( ) . -,单目运算符,算术运算符,关系运算符,逻辑运算符(不包括!),条件运算符,赋值运算符,逗号运算符,优先级别由上到下递减。特殊运算符优先级最高,逗号运算符优先级最低。位运算符的优先级比较分散(有的在算术运算符之前(如),有的在关系运算符之前(如),有的在关系运算符之后(如&、|)。,2.4.2 算术运算符和算术表达式,1.基本的算术运算符 基本的算术运算符有:加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)五种。 两个整数相除的结果为整数,如5/3的结果为1,舍去小数部分。但是,如果除数或被除数中有一个为负值,多数机器采取“向零取整”的方法,即5/3=1,-5/3=-1,取整后向零靠拢。 求余运算符“%”要求参与运算的量均为整型,运算结果等于两数相除后的余数,余数的符号取决于被除数的符号,如-100%3余数为-1,100%-3余数为1。,2.自增自减运算符,+i ,-i 在使用i之前,先使i的值加(减)1 i+, i- 在使用i之后,再使i的值加(减)1 粗略地看,+i和i+的作用相当于i=i+1,但+i和i+不同之处在于+i是先执行i=i+1后,再使用i的值;而i+是先使用i的值后,再执行i=i+1。,例2.6,如果i的原值等于3,执行下面的赋值语句: j=+i;(i的值先变为4,再赋给j,j的值为4) j=i+;(先将i的值3赋给j,j的值变为3,然后i的值变为4),例2.7,P35例2.5 main() int c=5; printf(“%d,%d,%dn”,c+=c+,c+8,+c); printf(“%dn”,c+=c+,c+8,+c); ,注意:Turbo C规定,printf()函数中出现多个表达式输出项时,先按从右到左的顺序计算各表达式的值,然后再从左到右输出结果。本例中先计算+c,得c=6, 然后计算c+8得14,最后计算c+=c+,得c=13。,1.有如下两个程序,试比较结果 main() int i=3; printf(“%d,%dn”,(i+)+(i+)+(i+),i); main() int i=3,k; k=(i+)+(i+)+(i+); printf(“%d,%dn”,k,i);,补充:,结果:12,3,结果:9,6,2.当出现难以区分的若干个+或-组成运算符串时,C语言规定,自左向右取尽可以多的符号组成运算符。 例如:设整型变量x,y均为3,则: x+y 应理解为(x+)+y,结果为6,x值 为4,y值不变 x-y 应理解为(x-)-y,结果为0,x值 为2,y值不变,3.算术运算符的优先规则,单目算术运算符(-、+、-)优先于*、/、%算术运算符优先于+、-算术运算符; 同级单目算术运算符的结合性自右向左; 同级双目算术运算符的结合性自左向右。,4.算术表达式,用算术运算符和括号将运算对象连接起来的式子,称为算术表达式。例如下面的表达式为算术表达式: a*b/c-1.5+a 如果一个算术运算符的两侧的数据类型不同,则按下面所述的内容先自动进行类型转换,使二者具有同一类型,然后再进行运算。,各类数值型数据间的混合运算,整型(包括 int, short, long, unsigned int, unsigned short, unsigned long)和实型(包括 float, double)数据可以混合运算。而字符型数据可以与整型通用,因此整型、实型和字符型数据间可以混合运算,在进行运算时,不同类型 的数据要先换成同一类型,然后进行运算,转换规则如下图所示:,图中横向向左的箭头表示必须的转换,如字符数据必须先转换为整数,short型转换为int,float型数据在运算时一律先转换为double型,以提高精度(即使是两个float型数据相加,也先都化成double型,然后再相加)。,纵向的箭头表示当运算为不同类型时转换的方向。例如int型与double型数据进行运算,先将int型数据转换为double型,然后在两个同类型(double型)数据间进行运算,结果为double型。注意箭头方向只表示数据类型级别的高低,由低向高转换。不要理解为int型先转换为unsigned int型,再转成long型,再转成double型。如果一个int型数据与一个double型数据运算,是直接将int型转换成double型。,例2.8,假设已指定i为int型变量,f为float型变量,d为double型变量,e为long型变量,有以下式子: 10+a+i*f-d/e,在计算机执行时从左至右扫描,运算次序为:进行10+a的运算,先将a转换为整数97,运算结果为107;由于“*”比“+”优先,先进行i*f的运算。先将i与f都转换成double型,运算结果为double型;整数107与i*f的结果相加。先将整数107转换成double型,再相加,结果为double型;将变量e化为double型,d/e结果为double型;将10+a+i*f的结果与d/e的商相减,结果为double型。,main() float x; int i; x=3.6; i=(int)x; printf(“x=%f,i=%d”,x,i);,结果: x=3.600000,i=3,上述类型转换由系统自动进行的,另一种类型转换为强制类型转换。 需要说明的是在强制类型转换时,得到一个所需类型的中间变量,原来变量的类型未发生变化。如:(int)x;如果x原来指定为float型,进行强制类型运算后得一一个int型的中间变量,它的值等于x 的整数部分,而x的类型不变(仍为float型)。见下例2.9:,2.4.3 关系运算符和关系表达式,所谓“关系运算”实际上是“比较运算”。将两个值进行比较,判断其比较的结果是否符合给定的条件。例如,a3是一个关系表达式,大于号()是一个关系运算符,如果a的值为5,则满足给定的“a3” 条件,因此关系表达式的值为逻辑值“真”(即“条件满足”),用整数“1”来表示;如果a的值为2,不满足“a3”的条件,则称关系表达式的值为逻辑值“假”,用整数“0”来表示。,1. 关系运算符及其优先次序,C语言提供下面6种关系运算符: (大于) = (大于等于) = (等于) != (不等于),优先级相同(高),优先级相同(低),关于优先顺序: 前4种关系运算符(、=)的优先级别相同,后2种也相同。前4种高于后2种; 关系运算符的优先级低于算术运算符; 关系运算符的优先级高于赋值运算符。,例2.10,例如: ca+b 等效于c(a+b) ab=c 等效于(ab)=c a=bc 等效于a=(bc),用关系运算符将两个表达式(可以是算术表达式、关系表达式、逻辑表达式、赋值表达式、字符表达式)连接起来的式子,称为关系表达式。 关系表达式的值是一个逻辑值,即“真”或“假”。例如,关系表达式“5=3”的值为“假”,“5=0”的值为“真”。C语言没有逻辑型数据类型,以1代表“真”,以0代表“假”。,2. 关系表达式,例2.11,a=3,b=2,c=1,则: 关系表达式“ab”的值为“真”,表达式的值为1; 关系表达式“(ab)=c”的值为“真”(因为ab的值为1,等于c的值),表达式的值为1; 关系表达式“b+cb d的值为1 f=abc f 的值为0(因为“”运算符是自左向 右的结合方向,先执行“ab”得值为 1,再执行关系 运算“1c”,得值 0,赋给f)。,例2.12 P36例2.6,main() int a=5,b=3; float x=3.14,y=6.53; printf(“%d,%dn”,a+b!=a-b,x=(y-=6.1); ,结果:1,0,2.4.4 逻辑运算符,C语言提供的逻辑运算符有三种:&(逻辑与)、 |(逻辑或)、!(逻辑非)。 “&”和“|”为双目运算符,它要求有两个运算量,如(ab)&(xy), (ay)。“!”是单目运算符,只要求有一个运算量,如!(ab)。,1.逻辑运算符及其优先次序,逻辑运算举例如下: a&b 若a、b为真,则a&b为真。 a|b 若a、b之一为真,则a|b为真。 !a 若a为真,则!a为假。,表2.3逻辑运算的真值表,在一个逻辑表达式中如果包含多个逻辑运算符,如!a&b|xy&c, 按以下的优先顺序和结合性: !优先于双目算术运算符优先于关系运算符优先于&优先于|; 单目逻辑运算符!和单目算术运算符同级别,结合性自右向左; 双目逻辑运算符的结合性是自左向右。,2.逻辑表达式,如前所述,逻辑表达式的值应该是一个逻辑量“真”或“假”。C语言编译系统给出逻辑运算结果时,以数值1代表“真”,以0代表“假”,但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”。即将一个非0的数值认作“真”。例如: 若a=4,则!a的值为0。因为a的值为非0,被认作“真”,对它进行“非”运算,得“假”,“假”以0来代表。,若a=4,b=5,则a&b的值为1。因为a和b均为非0,被认为是“真”,因此a&b的值也为“真”,值为1。 a、b值同前,a|b的值为 a、b值同前,!a|b的值为 4&0|2的值为 结论:由系统给出的逻辑运算结果不是就是1,不可能是其他数值。而在逻辑表达式中作为参加逻辑运算的运算对象可以是0(“假”)或任何非0的数值(按“真”)对待。如果在一个表达式中不同位置上出现数值,应区分哪些是作为数值运算或关系运逄的对象,哪些作为逻辑运算的对象。例如,1,1,1,53&83”(因为关系运算符优先于&)。在关系运算符两侧的5和3作为数值参加关系运算,“53”的值为1。再进行“1&84-!0”运算,8的左侧为“&”,右侧为“”运算符,根据优先规则,应先进行“”的运算,即先进行“84-!0”的运算。现在4的左侧为“”,右侧为“-”运算符,而“-”优先于“”,因此应先进行“4-!0”的运算,由于“!”级别高,因此先进行“!0”的运算,得到结果1。然后进行“4-1”的运算,得结果3,再进行“83”的运算,得结果0,最后进行“1&0”的运算,得到结果0。,注意,在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。 a&b&c 只有a为真(非0)时,才需在判断b的值,只有a和b都为真的情况下才需在判别c的值。只要a为假,就不必判别b和c(此时整个表达式已确定为假)。如果a为真,b为假,不判别c。 a|b|c 只要a为真(非0),就不必判断b和c;只有a为假,才需要判别b;a和b都为假才判别c。,例2.13,main() int w=1,x=2,y=3,z=4,a=5,b=6,c; c=(a=wx) 结果:m=1,n=0,l=1,2.4.5赋值运算符和赋值表达式,1.简单赋值运算符 赋值符号“=”就是赋值运算符,它的作用是将一个数据赋给一个变量。如“a=3”的作用就是执行一次赋值运算,把常量3赋给变量a。也可以将一个表达式的值赋给一个变量。如:x=a+b*c。,2.复合赋值运算符,在赋值符“=”之前加上某些二目运算符可构成复合赋值运算符。 复合算术赋值运算符有:+=、-=、*=、/=、%=五种。 复合位运算赋值运算符有:=、&=、=、|=五种。,3.赋值表达式,由赋值运算符将一个变量和一个表达式连接起来的的式子称为“赋值表达式”。其一般形式为: 赋值表达式的求解过程:将赋值运算符右侧的“表达式”的值赋给左侧的变量,赋值表达式的值就是被赋值的变量的值。如“a=5”这个赋值表达式的值为5(变量a的值也为5)。,上述赋值表达式的一般形式中的“表达式”,又可以是一个赋值表达式。如a=(b=5),括号内的“b=5”是一个赋值表达式,它的值等于5。“a=(b=5)”相当于“ b=5”和“a=b”两个赋值表达式,因此a的值等于5,整个赋值表达式的值也等于5。 我们知道赋值运算符按照“自右向左”的结合顺序,因此,“b=5”外面的括号可以不要,即“a=(b=5)”和“a=b=5”等价,都是先求“b=5”的值(得5),然后再赋给a,下面举几个例子:,a=b=c=5 (赋值表达式值为5,a、b、c 值均为5) a=5+(c=6) (表达式值为11,a值为11,c 值为6) a=(b=4)+(c=6) (表达式值为10,a值为10, b值为4,c 值为 6) a=(b=10)/(c=2) (表达式值为5,a值为5,b 值为10,值为2),赋值表达式中可包含复合的赋值运算符。如:a+=a-=a*a,如果a的初值为12,此赋值表达式的求解步骤如下: a)先进行“a-=a*a”运算,它相当于 a=a-a*a=12-144=-132; b)再进行“a+=-132”运算,相当于 a=a+(-132)=-132-132=-264。,补充,如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时要进行类型转换。 将实型数据(包括单、双精度)赋给整型变量时,舍弃实数的小数部分。如i为整型变量,执行“i=3.56”的结果是使i的值为3,在内存中以整数形式存储。 将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中,如将23赋给float变量f,即f=23,先将23转换成23.00000,再存储在f中。如将23赋给double型变量d,即d=23,则将23补足有效位数字为23.00000000000000, 然后以双精度浮点数形式存储到d中。,将一个double型数据赋给float变量时,截取前面7位有效数字,存放到float变量的存储单元中,但应注意数值取值范围不以溢出。 字符型数据赋给整型变量时,由于字符只占有1个字节,而整型变量占2个字节,因此将字符数据(8位)放到整型变量低8位中,整型变量高8位有两种情况: 若是将unsigned char数据赋给整型变量, 高8位补0。 若是将char数据赋给整型变量,如果字符最高位为0(0127),则整型变量高8位补0;如果字符最高位为1(-128-1),则整型变量高8 位补1。,将一个int、short、long型数据赋给一个char型变量时,只将其8位原封不动地送到char型变量(即截断)。 将int型数据赋给long型变量时,要进行符号扩展,将整型数据的16位送到long型低16位中,如果int型数据为正值(符号位为0),则long型变量的高16位补0;如果int型变量为负值(符号位为1),则long型变量的高16位补1,以保持数值不变。 将unsigned int型数据赋给long型变量时,不存在符号扩展问题,只需将高位补0。 将一个unsigned 类型数据赋给一个占字节数相同的signed 变量(如:unsigned int=int, unsigned long=long, unsigned short=short, unsigned char=char),将unsigned型数据的,内存中各位原样送到signed型变量中,若unsigned 类型数据未超过要赋值的变量的范围,则signed型变量值与unsigned型数据值相同;若超过,要根据补码知识进行转换。如: main() unsigned int a=65535; int b;b=a; printf(“%d”,b); 结果输出-1,将signed型数据赋给所占字节相同的unsigned型变量,同样将signed型数据所占内存的各位原样送到unsigned型变量内存中,若signed型数据为非负值,则unsigned型变量值与signed型数据值相同;若为负值,要根据补码知识进行转换。如: main() unsigned a; int b=-1;a=b; printf(“%u”,a); 结果输出65535。,2.4.6 条件运算符和条件表达式,1.条件运算符 条件运算符要求有3个操作对象,它是C语言中唯一的三目运算符。 条件运算符的优先级规则: 其他运算符优先于条件运算符,条件运算符优先于赋值运算符和逗号运算符; 条件运算符的结合性是自右向左。,2.条件表达式,用条件运算符构成的表达式称为条件表达式,其一般形式为: 表达式1?表达式2:表达式3 条件表达式的执行顺序是:先计算表达式1的值,若值为非0(真),则计算表达式2的值,并将表达式2的值作为整个条件表达式的结果;若表达式1的值为0(假),则计算表达式3的值,并将表达式3的值作为整个条件表达式的结果。,例2.14,main() int a=1,b=2,c=3,d=4,e; e=ab?a:cd?c:d; printf(“%dn”,e);,条件运算符的结合方向为“自右向左”。所以条件表达式ab?a:cd?c:d相当于ab?a:(cd?c:d)。,2.4.7 逗号运算符和逗号表达式,C语言中提供了一种特殊的运算符逗号运算符。它用来将两个表达式连接起来组成一个表达式,如3+5,6+8 称为逗号表达式。其一般形式为: 表达式1,表达式2 其求解过程是:先求解表达式1,再求解表达式2,并将表达式2的值作为整个逗号表达式的值。如上面的逗号表达式“3+5,6+8”的值为14,又如,a=3*5,a*4 由表2.2可知:赋值运算符的优先级别高于逗号运算符,因此应先求解a=3*5这个赋值表达式,计算得这个赋值表达式值为15,再求解a*4这个表达式,得60,整个逗号表达式的值为60。 一个逗号表达式又可以与另一个表达式组成一个新的表达式,所以逗号表达式的一般形式可扩展为: 表达式1,表达式2,表达式3表达式n 顺序求解这n个表达式,整个表达式值为表达式n的值。,请注意并不是任何地方出现的逗号都是作为逗号运算符,例如 变量说明:int a,b,c; 函数参数:printf(“%d,%d,%d”,a,b,c);其中的“a,b,c”并不是一个逗号表达式,它是printf函数的3个参数。,2.4.8 位运算符和位运算,1.“按位与”运算符(&) 参与运算的两个数,按二进位进行“与”运算。如果两个相应的二进位都为1,则该位的结果值为1,否则为0。即: 0&0=0;0&1=0;1&0=0;1&1=1,2.“按位或”运算符(|) 参与运算的两个数,按二进位进行“或”运算。如果两个相应的二进位只要一个为1,则该位的结果值为1,即: 0&0=0;0&1=1;1&0=1;1&1=1,3.“按位异或”运算符() 异或运算符也称XOR运算符。它的规则是若参加运算的两个二进位相异时,结果位为1。 即 00=0;01=1;10=1;11=0,2.4.8 位运算符和位运算,4.“按位取反”运算符() 是一个单目运算符,用来对一个二进制数按位取反,即将0变为1,1变为0。,例2.15,教材P37例2.9,第三章 输入和输出,所谓输入输出是以计算机主机为主体而言的,从计算机向外部输出设备(如显示屏、打印机、磁盘等)输出数据称为“输出”,从外部由输入设备(如键盘、磁盘、光盘、扫描仪等)输入数据称为“输入”。 一个完整的程序都应该有数据的输入输出功能,没有输出功能是无用的,因为程序运行的结果看不见;没有输入功能则程序缺乏灵活性,每次运行都只能对相同的数据执行操作,所以输入输出是程序中不可缺少的部分。,C语言中输入和输出都是由函数来实现的,C提供的函数以库的形式存放在系统中(如输入输出函数库、数学函数库、字符函数库、字符串函数库等),每个函数库含有若干个函数,C语言提供了一批标准输入输出函数,其中有putchar(输出字符)、getchar(输入字符)、printf(格式输出) 、scanf(格式输入) 、puts(输出字符串)、gets(输入字符串),本章中介绍前四个最基本的输入输出函数。,在使用C语言库函数时,要用文件包含命令“#include”将有关的“头文件”包括到用户的源文件中,在头文件中包含了要用到的函数有关的一些信息,如变量的定义和宏定义。例如使用标准输入输出库函数时,要用到“stdio.h”文件,stdio是standard input&output的缩写,文件后缀“h”是head的缩与,#include命令都是放在程序的开头,因些这类文件又被称为“头文件”,在调用标准输入输出库函数时,程序开头应用以下文件包含命令: #include 考虑到printf和scanf函数使用频繁,系统允许在使用这两个函数时可不加#include命令。,3.1字符的输入输出函数,C语言提供了两个标准的字符输入输出函数putchar和getchar,在使用这两个函数时,在程序的头部一定要加上下面的文件包含命令: #include,3.1.1字符输出函数(putchar),putchar函数的作用是向终端(显示屏)输出一个字符,其一般形式为 putchar(ch); 意思是在显示屏上输出括号内字符变量ch所代表的字符,ch可以是字符数据(常量或变量)和整型数据(常量或变量)。,例3.1,教材P49例3.7 #include main() char a=Y;b=e;putchar(a);putchar(b); putchar(s);putchar(n);putchar(141);,Y,e,s,a,结果:,3.1.2字符输入函数(getchar),getchar函数的作用是从终端(键盘)设入一个字符。其一般形式为: getchar(); getchar()只能接收一个字符,该字符可以赋给一个字符变量或整型变量,也可以不赋给任何变量,作为表达式的一个运算对象参加表达式的运算处理。,例3.2,教材P50例3.8 #include main() char c;c=getchar();putchar(c); 例3.3 教材P50例3.9 #include main() int c;c=getchar(); c=a,3.2 格式输入输出函数,C语言提供了两个标准的格式输入输出函数,即格式输入函数scanf和格式输出函数printf。 字符输入输出函数只能输入输出单个字符,而格式输入输出函数可按指定的格式输入输出若干个任意类型的数据。,3.2.1格式输出函数(printf),printf函数作用是按用户指定的格式,把若干个任意类型的数据输出到显示屏上。 其一般形式为 printf(“格式控制字符串”, 输出表列); 格式控制字符串用来指定输出的格式,它由格式字符串和非格式字符串两大类组成。,格式字符串是以%开头的字符串,用来指定输出数据的类型、形式、长度、小数位数等。 非格式字符串包括普通字符(原样输出)和转义字符(如n、t、r、101等)。 输出表列表示要输出的各个数据项,要求格式字符串和各输出项在数量和类型上应该一一对应。,1.格式字符串 格式字符串的一般形式为: %标志输出最小宽度.精度长度类型 类型:指定输出数据的类型,标志:有-、+、#、0四种,输出最小宽度:用十进制正整数来表示输出的最小位数,若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。 精度:以“.”开头,后跟十进制正整数,如果输出实数,则表示小数的位数;如果输出字符串,则表示输出字符的宽度,若实际小数位数大于所定义的精度数,要截去超过的部分。 长度:格式符“l”表示按长整型输出。,例3.4,main() unsigned int a=65535; int b=-2; printf(“a=%d,%o,%x,%un”,a,a,a,a); printf(“b=%d,%o,%x,%un”,b,b,b,b); ,结果:a=-1,177777,ffff,65535 b=-2,177776,fffe,65534,例3.5字符串的输出,main() printf(“%3s,%7.2s,%.4s,%-5.3sn”, “china”,“china”,“china”,”china”); ,结果:china, ch,chin,chi,例3.6输出实数时指定小数位数,main() float f=123.456; printf(“%f%10f%10.2f%.2f %-10.2fn”,f,f,f,f,f); ,结果: 123.456001123.456001123.46 123.46 123.46,3.2.2格式输入函数(scanf),scanf函数作用是按用户指定的格式从键盘上把数据输入到指定的变量中。 其一般形式为: scanf(“格式控制字符串”, 地址表列); 格式控制字符串是用来指定要输入的数据的格式,地址表列给出要赋值的各变量的地址,地址由地址运算符“&”后加变量名构成,如&a表示变量a的地址。,1.格式字符串 格式字符串的一般形式为: %*输入宽度长度类型 类型:指定输入数据的类型,“*”格式符 用来表示所对应的输入项读入后不赋予相应的变量。如 scanf(“%d %*d %d”, 当输入1 2 3时,把1赋给变量a后,跳过2,再把3赋给变量b。,输入宽度:是十进制的正整数,用来指定输入的宽度,系统自动按它截取所需数据。如: scanf(%3d%3d”,h表示输入短整型数据(如%hd)。,2.使用scanf函数应注意的问题,scanf函数中的“格式控制字符串”后面应当是变量地址,而不是变量名。如:若a、b为整型变量,则: scanf(“%d,%d”,a,b);是错误的,应将a,b改为&a,&b。 如果在“格式控制字符串”中有非格式字符则在输入数据时,也应输入与这些字符相同的字符。如:,scanf(“%d,%d,%d”, 输入时要输为:a=1,b=2,c=5 在输入多个数值数据时,如果格式控制字符串中没有非格式字符作输入数据之间的间隔符时,则可用空格,tab或回车作间隔;在输入字符数据时,若格式控,制字符串中没有非格式字符,则所有输入的字符都被认为是有效字符,如: scanf(“%c%c%c”,是不合法的。,第四章 语句和流程控制,流程主要用来规定程序的执行的顺序。 流程分为3种基本结构:顺序、分支、循环。各种复杂的程序都可由这三种基本结构来构成。C语言提供了多种语句来实现这三种结构。,4.1 C语句,应当指出:C语句都是用来完成一定操作任务的,声明部分的内容不应称为语句,如int a; C语句可分为以下5类: 表达式语句 由表达式加上分号“;”组成,如: a=3 是一个赋值表达式 而a=3; 是一个赋值语句 函数调用语句 由函数名、实际参数加上分号“;”组成,,执行函数调用语句就是把实际参数赋给被调用函数 控制语句 C有9种控制语句: if语句(条件语句) switch语句(多分支选择语句) while语句 do while语句 for语句,条件判断语句,循环执行语句,goto语句(转向语句) break语句(中止执行switch或循环语句) continue语句(结束本次循环语句) return语句(函数调用返回值语句) 复合语句 把多
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 社区物业安全知识培训课件
- 统编版五年级语文上册第一单元拔尖测评卷(含答案)
- 北师大版五年级上册数学期末检测题(无答案)
- 荔湾电梯销售合同范本
- 浙江郊区厂房合同范本
- 猎头招聘合同范本
- 建大棚质保合同范本
- 鸡粪采购合同范本
- 餐饮员工聘用合同范本
- 正规租房和合同范本
- 《急性心肌梗死》课件-
- 管径选择与管道压力降计算(三)92~137
- 全套教学课件《工程伦理学》
- 2024-2025学年辽宁省普通高中高三上学期9月开学联考物理试题(解析版)
- 2024-2025学年浙江Z20名校联盟高三第一次联考英语试题(解析版)
- 《卫生法》知识考试参考题库(含答案)
- 2024至2030年中国猪肉脯行业市场发展现状及潜力分析研究报告
- 2024广西专业技术人员继续教育公需科目参考答案(97分)
- 耳穴贴压技术操作评分标准
- 颅脑疾病CT诊断课件
- 假的体检报告单模板
评论
0/150
提交评论