1.76k likes | 1.94k Views
C 语言程序设计. 第 1 章 C 语言概述 第 2 章 数据类型、常量和变量 第 3 章 运算符和表达式 第 4 章 程序结构 第 5 章 数组 第 6 章 函数 第 7 章 指针 第 8 章 编译预处理与结构体 第 9 章 文件. 本课程知识结构. 第 1 章 C 语言概述. 1.1 C语言的发展和特点. 1.1.1 C语言的发展. 为了提高程序的可读性和可移植性,最好改用高级语言,但一般高级语言难以实现汇编语言的某些功能。人们设想能否找到一种既具有一般高级语言特性,又具有低级语言特性的语言,集它们的优点于一身。 C 语言就在这种情况下应运而生了。.
E N D
第1章 C语言概述 • 第2章 数据类型、常量和变量 • 第3章 运算符和表达式 • 第4章 程序结构 • 第5章 数组 • 第6章 函数 • 第7章 指针 • 第8章 编译预处理与结构体 • 第9章 文件 本课程知识结构
第1章 C语言概述 1.1C语言的发展和特点 1.1.1C语言的发展 为了提高程序的可读性和可移植性,最好改用高级语言,但一般高级语言难以实现汇编语言的某些功能。人们设想能否找到一种既具有一般高级语言特性,又具有低级语言特性的语言,集它们的优点于一身。C语言就在这种情况下应运而生了。
第1章 C语言概述 1.1.1C语言的发展 C语言的主要特点如下: (1)简洁、紧凑、灵活。 (2)模块化、结构化。 (3)移植性强。 (4)C语言允许直接访问物理地址,能进行位(bit)一级的操作,能实现汇编语言的大部分功能,可以直接对硬件进行编程操作,因此C语言既具有高级语言的功能,又具有低级语言的许多功能,可用来编写系统软件。 (5)生成目标代码质量高,程序执行效率高。
第1章 C语言概述 1.2C程序的基本构成 1.2.1C程序的组成 一个C程序可由以下几部分组成: (1)文件包含部分。 (2)预处理部分。 (3)变量说明部分。 (4)函数原型声明部分。 (5)主函数部分。 (6)函数定义部分。
第1章 C语言概述 1.2.1C程序的组成 关于程序的结构的说明如下: (1)并不是所有的C程序都必须包含上面的6个部分,一个最简单的C程序可以只包含文件包含部分和主函数部分两部分。 (2)每一个C程序文件的后缀为“.c”,并且每一个C源程序都必须有且仅有一个主函数,主函数的组成形式为: main(){ 变量说明部分; 程序语句部分; }
第1章 C语言概述 1.2.2C程序的书写格式 C程序的书写格式遵循以下原则: (1)函数是构成C语言程序的基本单位。 (2)C语言程序总是从主函数main()开始执行。 (3)函数体必须由一对大括号“{}”括起来。 (4)C程序书写格式自由。 (5)在C语言程序中,要严格区分字母的大小写。
第1章 C语言概述 1.2.3C程序的算法 一个算法应该具有如下5个特性。 1)有穷性 2)确定性 3)可行性 4)有零个或多个输入 5)有一个或多个输出 流程图也是描述算法的很好的工具,一般的流程图由图中所示的几种基本图形组成。
第1章 C语言概述 1.3C语言的开发环境 启动Turbo C 2.0集成开发环境后即可看到Turbo C 2.0的主窗口,如图所示。
第1章 C语言概述 1.3C语言的开发环境 Turbo C 2.0的主窗口由主菜单、编辑区、消息窗口和功能键提示行组成。 主菜单在主屏幕顶上一行,由File、Edit、Run、Compile、Project、Options、Debug、Break/watch等菜单项组成,除Edit外,其他各项均有子菜单,只要按Alt键加上某项中第一个字母(即大写字母),就可进入该项的子菜单中。编辑区在主屏幕中间,对源程序的编辑工作都要在编辑区进行,它占据了主屏幕的大部分空间。信息窗口用于显示编译和链接时的有关信息,程序员可以根据提示信息对源程序进行修改调试。功能键提示行列出了Turbo C 2.0常用的7个功能键含义。
第2章 数据类型、常量和变量 2.1 数 据 类 型 数据类型是对程序所处理数据的一种“抽象”,通过类型名对数据赋予一些约束,以便进行高效处理和检查。这些约束包括以下几个方面: (1)取值范围。 (2)存储空间大小。 (3)运算方式。
第2章 数据类型、常量和变量 2.1 数 据 类 型 C语言的基本数据类型有如下不同的类型: (1)从长度上分,有8位、16位、32位和64位。 (2)从数据的符号来分,有无符号数和有符号数。 (3)按照数据的数学性质,分为整型、实型和字符型。
第2章 数据类型、常量和变量 2.2常量 2.2.1整型常量 在C语言中,整型常量可用以下3种形式表示。 (1)十进制整数。这是最常用的一种形式,如512、-16。 (2)八进制整数。以数字0开头的数是八进制数,例如,0116表示八进制整数,相当于十进制整数78。-012表示八进制数,即十进制数-10。 (3)十六进制整数。以0x开头的数是十六进制数,例如,0xA5表示十六进制整数,即十进制数165。
第2章 数据类型、常量和变量 2.2.2实型常量 实型常量又称为浮点数或实数。C语言中,实数只有十进制形式,它有两种表示方式:一种是定点数形式,另一种是浮点数形式。 (1)定点数形式:凡不带指数部分的数称为定点数。例如,3.141 59,-1.298,10,2 009 等。整数都属于定点数。 (2)浮点数形式,又称为指数形式。在计算机内部,实数都以浮点形式存储。 C语言将实型数据分为float、double、long double三种类型,且默认实型数据是double类型。因此,对于实型常量,C语言编译器会将它视为double类型。如果特别说明某实型常量是float类型或long double类型,可以加上后缀字母表示。 (1)用f或F表示float类型,如123.5f,1.234 5e+3F。 (2)用l或L表示long double类型,如123.5l,1.234 5e+3L。
第2章 数据类型、常量和变量 2.2.3字符型常量 C语言中的一个字符常量占据一个字节的存储空间,在该字节中存放的并不是字符本身,而是该字符的ASCII码值。如字符A的ASCII码值为65,0的ASCII码值为48。由于字符常量存储的是一个整数,因此它可以像整数一样参与数值运算。在C语言程序中,字符常量通常用于字符之间的比较。 C语言还允许一种特殊形式的字符常量,就是以反斜杠“\”开头的转义字符序列。转义字符序列用来表示ASCII码字符集内的控制代码。例如,前面用“\n”表示换行,“\n”实际上是一个字符,它的ASCII码值为10。转义字符常用于表示ASCII字符集内的控制字符和某些用于功能定义的字符,如单引号、双引号和反斜杠等。
第2章 数据类型、常量和变量 2.2.4字符串型常量 C语言中,字符串在内存中存储时,系统自动在字符串的末尾加ASCII码值为0的字符,用以表示该字符串的结束。因此,长度为n个字节的字符串,实际上占据了n+1个字节的存储空间。例如,字符串常量"12345"有5个字节,占据了6个字节的存储空间,其存储形式如图所示。
第2章 数据类型、常量和变量 2.2.4字符串型常量 "A"和A除了形式上有区别外,在内存中的存储形式也是不同的,如图所示。
第2章 数据类型、常量和变量 2.3变量 2.3.1变量的要素及定义 1. 变量的两个要素 1)变量名 每个变量都必须有一个名字——变量名,在内存中占据一定的存储单元。变量命名遵循标识符命名规则。 2)变量值 在程序运行过程中,变量值存储在内存中。在程序中,通过变量名来引用变量的值。
第2章 数据类型、常量和变量 2.3.1变量的要素及定义 2.变量的定义 变量定义的一般格式如下: [存储类型]数据类型 变量名[, 变量名2……] 在C语言中,要求对所有用到的变量进行强制定义,这样做的目的是: (1)凡未被事先定义的,不作为变量名,这就能保证程序中变量名使用得正确。 (2)每一个变量被指定为一确定类型,在编译时就能为其分配相应的存储单元。 (3)指定每一变量属于一个类型,便于在编译时,据此检查该变量所进行的运算是否合法。
第2章 数据类型、常量和变量 2.3.2变量的初始化 所谓变量的初始化,也就是在定义变量的同时对变量赋初值。可以给其中的一个赋值,也可以同时给多个变量赋值。例如: int sum=0; char ch1=a,ch2=b; int a,b,c=10; 需要说明的是,变量的初始化不是在编译阶段完成的(除了静态存储变量和外部变量),而是在程序运行时才被赋值的。
第2章 数据类型、常量和变量 2.3.3变量的分类 • 1.整型变量 • 1)整型数据在内存中的存放形式数值是以补码表示的: • 正数的补码和原码相同; • 负数的补码:将该数的绝对值的二进制形式按位取反再加1。 10的原码: 取反: 10的补码:
第2章 数据类型、常量和变量 2.3.3变量的分类 • 2)整型变量的分类 • (1)基本型:类型说明符为int,在内存中占2个字节。 • (2)短整型:类型说明符为short int或short。所占字节和取值范围均与基本型相同。 • (3)长整型:类型说明符为long int或long,在内存中占4个字节。 • (4)无符号型:类型说明符为unsigned。 • 无符号型又可与上述3种类型匹配而构成: • 无符号基本型:类型说明符为unsigned int或unsigned。 • 无符号短整型:类型说明符为unsigned short。 • 无符号长整型:类型说明符为unsigned long。
第2章 数据类型、常量和变量 2.3.3变量的分类 • 3)整型变量的定义 • 整型变量定义的一般形式为: • 类型说明符 变量名标识符,变量名标识符,…; • 例如: • int a,b,c; (a,b,c为整型变量) • long x,y; (x,y为长整型变量) • unsigned p,q; (p,q为无符号整型变量) • 在书写变量定义时,应注意以下几点: • 允许在一个类型说明符后,定义多个相同类型的变量。各变量名之间用逗号间隔。类型说明符与变量名之间至少用一个空格间隔。 • 最后一个变量名之后必须以“;”号结尾。 • 变量定义必须放在变量使用之前。一般放在函数体的开头部分。
第2章 数据类型、常量和变量 2.3.3变量的分类 2.实型变量 1)实型变量的分类 根据数值的范围可分为单精度(float)、双精度(double)和长双精度(long double)3种类型。 2)实型数据的存储 一个实型数据一般在内存中占4个字节(32位)。与整型数据的存储方式不同,实型数据是按照指数形式存储的。系统把一个实型数据分成小数部分和指数部分,分别存放。
第2章 数据类型、常量和变量 2.3.3变量的分类 3.字符变量 1)字符变量的定义 定义字符变量的一般形式如下: char ch1,ch2; 表示定义了ch1和ch2为字符变量,各能存储一个字符常量。可以用下面语句对ch1和ch2赋值: ch1=a;ch2=b;〖1〗一个字符变量只能存储一个字符常量。 2)字符变量的存储 将一个字符常量放到一个字符变量中,并不是把该字符本身放到内存单元中去,而是将该字符的ASCII码放到存储单元中。
第2章 数据类型、常量和变量 2.4数据类型转换 2.4.1数据类型的隐式转换 1.赋值转换 当赋值运算符两边的类型不同时,C语言允许通过赋值运算符使赋值号右边表达式值的类型自动转换成其左边变量的类型。赋值转换具有强制性。 当将实型数据(包括单、双精度)赋给整型变量时,舍弃实数的小数部分。例如,i是整型变量,执行“i=5.68;”的结果是i的值为5。 当将整型数据赋给实型变量时,数值不变,但以实数形式存放到整型变量中。 2.输出转换 如一个长整型数在格式输出函数printf()中指定用%d格式输出,相当于先将长整型数转换成整型再输出。
第2章 数据类型、常量和变量 2.4.2数据类型的显式转换 C语言提供了一种“强制类型转换”运算符,将一种类型的变量强制转换成另一种类型。例如,(int)3.5中“(int)”的作用是将实型数据3.5转换成整型。 强制类型转换是一种显式转换,其一般形式为: (类型标识符) 表达式 其作用是把表达式的值转换为类型名指定的类型。 例如: (double) a(把a转换成double类型) (char)(8-3.14*x)(得到字符型数据) (float)(x=99)(得到单精度数据) k=(int)((int)x+(float)i+j)(得到整型数据)
第3章 运算符和表达式 3.1算术运算符与算术表达式 3.1.1算术运算符 1.基本算术运算符 +、-、*、/和求模(%)运算为基本算术运算符,当进行两个整型数相除时,其结果仍为整型数,小数部分被略去。例如: 27/5=5 27/7=3 取模运算符“%”用于计算两个数相除后得到的余数,只适用于两个整型数取模,不能用于其他数据的运算。在“x%y”表达式中,x是被除数,y是除数。
其中i是一个整型变量。对一个变量实行前置或后置运算其结果是相同的,即都使它增1或减1。区别是前置运算是在该变量参与其他运算之前先增1或减1,而后置运算是在它参与其他运算之后才增1或减1。其中i是一个整型变量。对一个变量实行前置或后置运算其结果是相同的,即都使它增1或减1。区别是前置运算是在该变量参与其他运算之前先增1或减1,而后置运算是在它参与其他运算之后才增1或减1。 第3章 运算符和表达式 3.1.1算术运算符 2.自增自减运算符 自增“++”和自减“――”运算符为变量的增1和减1提供了紧凑而方便的表达形式。但这两种运算符都有前置和后置之分,其一般用法如下: i++或++ i i--或--i
第3章 运算符和表达式 3.1.1算术运算符 使用自增自减运算时,应注意如下几点: (1)自增自减运算的操作数一定是变量,而不能是其他表达式。(2)一个变量的前、后置运算只表明该变量参与其他运算与其自身变化之间的先后关系,并不影响它在表达式中参与其他运算的顺序。 (3)“++”和“--”运算符是自右向左结合的,单目运算符“-”也是自右向左结合的。因此,对-i++就理解为-(i++),而不应理解为(-i)++。(-i)++是非法的,因为它是表达式而不是变量。 (4)自增和自减运算常用于数组下标改变循环次数控制。
第3章 运算符和表达式 3.1.2算术表达式 算术表达式是由算术运算符和圆括号将操作数连接起来的表达式。操作数包括常量、变量和函数等。最简单的表达式是一个常量或一个变量。一般情况下一个表达式可以有多个运算符,例如: a+b*c -a/(b+c)-10%7*a
第3章 运算符和表达式 3.2关系运算符与关系表达式 3.2.1关系运算符 C语言中有6种关系运算符,即: (1)>=(大于等于)。 (2)<=(小于等于)。 (3)= =(等于)。 (4)!=(不等于)。 (5)>(大于)。 (6)<(小于)。
第3章 运算符和表达式 3.2.2关系表达式 系表达式就是用关系运算符把操作对象连接起来而构成的式子,操作对象可以是各种表达式,对于关系表达式或逻辑表达式,应把其值理解为1(真)或0(假)。例如,表达式 5>(4<5) 由于(4<5)是“真”,所以其值为1,于是该表达式成立,其值为1(真)。 又如,假设x=10,y=5,则表达式 x==y+5 /*其值为“真”*/ (x=3)<5+y /*其值也为“真”*/ x=y<y+5 /*则x=1,因为y<y+5是“真”*/ 下边都是合法的关系表达式: a>b、a+5>b-3、(a=100)>(y=50)、a<b、(a>b)>(b<c)
第3章 运算符和表达式 3.3逻辑运算符与逻辑表达式 3.3.1逻辑运算符 逻辑运算符是对逻辑量进行操作的运算符。逻辑量只有两个值:“真”和“假”,它们分别用1和0表示。C语言中有3个逻辑运算符,即: (1)!(逻辑非) (2)&&(逻辑与) (3)||(逻辑或) 逻辑运算符&&和||是双目运算符,!是单目运算符,它们的操作对象是逻辑量或表达式(可以是关系表达式或逻辑表达式),其操作结果仍是逻辑量。
第3章 运算符和表达式 3.3.2逻辑表达式 逻辑表达式是用逻辑运算符把操作对象(可以是关系表达式或逻辑表达式)连起来所构思的一种运算式,其操作结果是“真(非零)”或“假(零)”。在处理逻辑表达式时要注意逻辑运算符的优先级及结合性,逻辑运算符的优先级从高到低的顺序依次是“!”、“&&”、“||”。“&&”和“||”的优先级低于关系运算符和算术运算符,而“!”高于基本算术运算符。
第3章 运算符和表达式 3.4位运算符与位表达式 3.4.1按位取反运算符 按位取反运算符就是将其操作对象中的所有二进制位全部改变状态,即“逢0变1,逢1变0”。例如,八进制数0217(即二进制10001111),其按位取反后为八进制数0160(即二进制位01110000)。所以~0217的值是0160。又如: unsigned char x=0137; /* 即二进制01011111 */ x=~ x; /* x的二进制结果为10100000 */
第3章 运算符和表达式 3.4.2移位运算符 1.左移运算符 左移运算符是将其操作对象向左移动指定的位数,每左移1位相当于乘以2,移n位相当于乘以2的n次方。一个二进制位组在左移时右边补0,移几位右边补几个0。其一般书写格式为: 表达式1<<表达式2 2.右移运算符 右移运算符是将其操作数向右移动指定的位数,右移操作相当于除以2,右移n位相当于除以2的n次方。在进行右移时,右边移出的二进制位被舍弃。其一般书写格式为: 表达式1>>表达式2
第3章 运算符和表达式 3.4.3按位“与” 按位“与”的一般书写格式为: 表达式1 & 表达式2 其中“表达式1”和“表达式2”均为整型表达式。 按位“与”遵循这样的原则:当两个操作对象的相应二进制位都为1时,则该位的结果为1,否则为0,即“两1为1,其余为0”。值得注意的是,按位“与”的运算,两个表达式之间用一个“&”符,而逻辑“与”,两个表达式之间用两个“&&”,这是初学者经常出错的地方。
第3章 运算符和表达式 3.4.4按位“或” 按位“或”遵循这样的原则:当两个操作对象的相应二进制位都为0时,则该对应位的按位“或”结果才为0,否则为1,可以简记为“两0为0,其余为1”。例如: 35 | 41 35的二进制表示为00000000001000011,41的二进制表示为0000000000101001,按位“或”的结果为0000000001101011。 按位“或”的一般书写格式为: 表达式1 | 表达式2 其中“表达式1”和“表达式2”是整型表达式。 可以利用按位“或”来将指定位设置为1。例如,将x的从右数第三位(二进制位)设置为1,则只需执行如下表达式即可: x=x|04 x的二进制表示为0111100001000011,04的二进制表示为0000000000000100,按位“或”的结果为0111100001000111。
第3章 运算符和表达式 3.4.5按位“异或” 按位“异或”遵循这样的原则:当其两个操作对象的相应位相同时,则该对应位“异或”的结果为0。可以简记为“相同为0,不同为1”,即0^0=0,0^1=1,1^1=0。按位“异或”也可称不进位加,即两个操作对象执行二进制相加,但不向高位进位。
第3章 运算符和表达式 3.5赋值运算符与赋值表达式 3.5.1赋值运算符 赋值运算符“=”是将其右边表达式的值赋给左边的变量,赋值号左边一定是变量,右边是表达式。如果右边表达式的类型与左边变量的类型不一致时,则先将右边表达式的值转换为与左边变量相同的类型,然后进行赋值。
第3章 运算符和表达式 3.5.2赋值表达式 由赋值运算符将一个变量和一个表达式连接起来的式子称为赋值表达式。它的一般形式为: <变量><赋值运算符><表达式> 如“a=5”是一个赋值表达式。对赋值表达式求解的过程是:将赋值运算符右侧的“表达式”的值赋给左侧的变量。赋值表达式的值就是被赋值的变量的值。例如,“a=5”这个赋值表达式的值为5(变量a的值也是5)。
第3章 运算符和表达式 3.6逗号运算符与逗号表达式 3.6.1逗号运算符 C语言还提供了一种特殊的运算符——逗号运算符(,),用它将两个表达式连接起来,例如: 3+5,6+9
第3章 运算符和表达式 3.6.2逗号表达式 逗号表达式是由逗号运算符连接表达式构成的。逗号表达式的一般形式为: 表达式1,表达式2 逗号表达式的求解过程是:先求解“表达式1”,再求解“表达式2”。整个逗号表达式的值是“表达式2”的值。例如,上面逗号表达式“3+5,6+9”的值为15。 逗号表达式的一般形式可扩展为: 表达式1,表达式2,表达式3,…,表达式n 它的值为最后“表达式n”的值。
第3章 运算符和表达式 3.7条件运算符与条件表达式 条件运算符由“?”号和“:”号组成,是C语言中仅有的一个三目运算符,该运算符需要3个操作数,它能够实现简单的选择功能,条件表达式的形式为: 表达式1?表达式2:表达式3 其中,“表达式1”必须是布尔型;“表达式2”,“表达式3”可以是任何类型,且类型可以不同。条件表达式的类型为“表达式2”和“表达式3”中类型高的一个类型。 条件表达式的执行顺序是:先求“表达式1”的值,若“表达式1”的值为非零时,整个条件表达式的值为“表达式2”的值;若“表达式1”的值为零,则整个条件表达式的值为“表达式3”的值。
第3章 运算符和表达式 3.7条件运算符与条件表达式 使用条件表达式需要注意以下几点: (1)条件表达式并不能取代所有的if…else语句,只有if…else语句中内嵌的语句为赋值语句且两个分支都给同一个变量赋值时才能代替if…else语句。 (2)在条件表达式中,条件1的类型可以和条件2、条件3的类型不同,也就是说表达式1的最终类型是逻辑型,即C语言中用“1”和“0”代表“真”和“假”。 (3)条件表达式中的表达式2和表达式3的类型也可以不同,此时条件表达式值的数据类型为两者中较高的数据类型。 (4)条件表达式可以嵌套,即在同一个条件表达式中可以多次出现条件运算符。
第3章 运算符和表达式 3.8运算符的优先级与结合性 一般而言,单目运算符优先级较高,赋值运算符优先级低。算术运算符优先级较高,关系和逻辑运算符优先级较低。多数运算符具有左结合性,单目运算符、三目运算符、赋值运算符具有右结合性。
第4章 程序结构 4.1 顺序结构 C语言中的顺序结构主要由表达式语句、说明语句、输入/输出语句、空语句和复合语句组成。C语言中的语句以分号“;”为结束标志,因此只要有分号的地方就会有一条语句,不管它前面是否有内容。顺序结构流程图如图所示。
第4章 程序结构 4.1.1基本语句 1.表达式语句 以分号结尾的赋值表达式叫表达式语句,也叫赋值语句。例如: a=b+c-d*e; 在赋值语句中,首先计算等号右边的表达式的值,然后将其值赋给等号左边的变量。如果等号右边的表达式的类型与左边变量的类型不一致,系统将自动把等号右边的表达式的值转换为与左边变量相同的类型,然后再赋值。
第4章 程序结构 4.1.1基本语句 2.复合语句和空语句 1)复合语句 把多个语句用括号{}括起来组成的一个语句称复合语句。在程序中应把复合语句看成是单条语句,而不是多条语句。 2)空语句 只有分号“;”组成的语句称为空语句。空语句是什么也不执行的语句。在程序中空语句可用来作空循环体。