C语言精品程序设计书稿_第1页
C语言精品程序设计书稿_第2页
C语言精品程序设计书稿_第3页
C语言精品程序设计书稿_第4页
C语言精品程序设计书稿_第5页
已阅读5页,还剩300页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第0章程序设计概论10程序与程序设计语言10.1.1 程序10.1.2程序设计语言10.2 c语言的历史和发展30.3 一个简单程序的诞生30.3.1简单的c语言程序概貌40.3.2第一个程序的诞生5本章小结7复习题7第1章c程序设计基础知识81.1变量81.1.1有关内存的基础概念81.1.2变量的引入81.2常量121.2.1字面常量121.2.2符号常量141.2.3 const 常量151.3算术运算符与算术表达式151.3.1运算符概述151.3.2算术运算符161.3.3算术表达式161.4赋值运算符与赋值表达式181.4.1简单赋值运算符181.4.2复合算术赋值运算符191.4

2、.3赋值运算吋的数据类型转换191.5自加、自减、逗号运算符201.5.1自加和自减运算符:+、-201.5.2逗号运算符221.6位运算231.6.1位运算的基本规律231.6.2位运算符23本章小结24复习题25第2章简单c语句262.1 c语句概述262.1.1表达式语句262.1.2控制语句262.1.3函数调用语句272.1.4复合语句272.1.5空语句272.2输入输出的概念282.3基本输入输出函数282.3.1格式化输出库函数:printf282.3.2格式输入库函数:scanf302.3.3字符输入输出函数32本章小结33复习题33第3章 分支结构程序设计343算法与基本程

3、序结构343.1.1算法简介343.1.2算法的表示353.1.3基本程序结构373.2关系运算和逻辑运算383.2.1关系运算383.2.2逻辑运算393.3讦语句40331简单if语句403.3.2 ifcisei吾句423.3.3 if语句的嵌套433.3.4 if语句使用注意事项453.4 switch 语句473.5条件运算符49本章小结50复习题50第4章循环结构程序设计514循环的引入514.2 for 循坏514.3 while 循环544.4 dowhile 循环554.5循环的比较574.5.1 for 语句和 while 语句574.5.2 while 语句禾u dowh

4、ile 语句604.5.3数值输入中的问题614.6循环嵌套634.6.1三重循环求解644.6.2缩小穷举法的搜索范围654.6.3两重循环解决问题664.6.3极限情况:一层循环的求解674.7 break 和 continue 语句694.7.1 break 语句694.7.1 continue 语句704.8应用举例71本章小结75复习题75第5章函数775.1函数的基本概念775.2函数的声明和定义785.2.1函数声明和函数原型785.2.2函数定义795.2.3函数的参数815.2.4函数的返回值与函数类型855.3函数的调用875.3.1函数调用的方式895.3.2函数调用过程

5、机制905.3.3函数的嵌套调用925.4函数的递归955.4.1递归的基本原理965.4.2尾递归98543递归与反向计算1005.4.4汉诺塔问题:双重递归1015.4.5递归的优缺点1045.5头文件的使用1045.6逐步求精107本章小结116复习题117第6章数组1186一维数组1186.1.1 一维数组的声明1186.1.2访问数组元素1206.1.3数组的初始化1226.1.4 一维数组应用举例1236.2二维数组1256.2.1二维数组的声明1256.2.2访问二维数组元素1266.2.3二维数组的初始化1266.2.4二维数组应用举例1276.3数组作为函数参数1296.3.

6、1数组元素用作函数的实参1296.3.2数组用作函数的参数130本章小结134复习题135第7章指针1377.1地址作为数据值1377.2指针变量1387.2.1声明指针变量1387.2.2有关指针的运算符1397.2.3指针操作1407.2.4 指针作为函数参数1437.3数组与指针1457.3.1通过指针操作数组元素1457.3.2函数、数组与指针1497.3.3保护数组内容1517.3.4多维数组与指针1567.3.5指向数组的指针1597.4函数指针1637.4.1通过函数指针调用函数1637.4.2函数指针用作函数参数1657.5动态分配内存168751 null扌旨针和void*类

7、型1687.5.2动态数组1697.5.3释放内存170本章小结170复习题171第8章字符数据处理172字符型常量和字符串1728.1.1转义字符1728.1.2字符串1738.2字符型变量1748.3字符数组1758.3.1字符数组的初始化1758.3.2 字符串和字符串结朿标志1768.4字符串和指针1798.4.1字符串的表示形式1798.4.2字符串指针作函数参数1808.5字符处理函数1818.6字符串应用实例184复习题189第9章结构1909.1结构类型说明1909.2使用结构1919.2.1结构类型变量1919.2.2结构变量的引用1939.2.3结构变量赋初值1939.3结

8、构和指针1949.3.1结构数组1949.3.2 指向结构的指针1989.4结构数据在函数间传递2039.5结构和链表2049.5.1单链表2049.5.2单链表结点的删除2079.5.3单链表的插入2089.5.4 环链表*210复习题212第10章文件21410文件的打开与关闭21410.1.1文件类型指针21410.1.2文件的打开21510.1.3文件的关闭21610.2文件的读写21710.2.1读写字符21710.2.2读写字符串21910.2.3格式化的读写22110.2.4成块读写(二进制读写)22210.3随机读写文件225本章小结227复习题228第11章turbo c图形

9、22911 图形模式的初始化及相关函数22911.2屏幕颜色设置和清屏23111.3 基本图形绘制23311.3.1 画点与位置坐标函数23311.3.2画直线、圆、椭圆与多边形函数23411.4线条样式设定23511.5 图形填充23711.5.1 封闭区间填充函数23711.5.2 设定填充方式23711.6 图形模式下的文本输出23811.7图形示例239复习题254第12章 存储类型25512.1作用域25512.1.1代码块作用域25512.1.2函数原型作用域25612.1.3文件作用域25612.2 链接25712.3存储期25812.4存储类型25912.4.1自动变量2591

10、2.4.2寄存器变量26012.4.3具有代码块作用域的静态变量26012.4.4具有外部链接的静态变量26212.4.5具有内部链接的静态变量26512.5存储类型说明符26612.6函数的存储类型268本章小结269复习题270附录a c语言预处理器272a预处理器命令272a.2 预处理器词法规则272a.3定义和替换273a.3.1对象式宏定义273a.3.2函数式宏定义274a.3.3重新扫描宏表达式276a.3.4取消宏定义与重新定义宏277a.3.5宏扩展屮的优先级错误278a.3.6宏参数的副作用278a.4 文件包含279a.5条件编译280a.5.1 #if> #el

11、se 与#endif 命令280a.5.2#elif 命令281a.5.3 #ifdef 与#ifndel 命令282a.5.4条件命令中的常量表达式283a.5.5 defined 运算符283a.6显式的行编号284a.7杂住指令285a.8错误指令285附录b常用函数286附录c图形驱动程序和模式289第0章程序设计概论用计算机解决问题包括两个概念上不同的步骤。首先应该构造一个算法或在解决该问题的 已有算法中选择一个,这个过程称为算法设计。第二个步骤是用一种程序设计语言将该算法表 达为程序。刚开始学习程序设计时将算法翻译成实际的编码过程会是较为困难的阶段。在学习 了更多的有关程序设计的过

12、程后,编码会很快变得简单,与此同时,随着要求解决的问题越来 越复杂,算法设计会变得越来越复杂。所以在学习中要有意识的兼顾这两个过程。本章介绍计算机程序设计的基本概念及发展。阅读本章读者将了解到程序设计中的一些基 本概念以及了解c语言的概貌。0.1程序与程序设计语言软件是计算机系统中不可缺少的部分。什么是软件?什么是程序?什么是程序设计语言? 本节将给出解答。0. 1. 1程序什么是软件?目前还没有一个精确的定义。但认为软件就是程序的概念肯定是错误的。目 前比较公认的定义是由著名的软件工程专家b.w.boehm提出的“软件是程序以及开发、使用 和维护所需要的所有文档”,由此可见,程序只是完整软件

13、产品的一个部分。什么是程序?国标屮规定“计算机程序是按照具体要求产生的适合于计算机处理的指令序 列”。也就是说,程序是计算机可以识别和执行的操作表示的处理步骤。我国颁布的计算机 软件保护条例更加明确提出“计算机程序是指为了得到某种结果而可以市计算机等具有信息 处理能力的装置执行的代码化指令序列,或者可被自动地转换成代码化指令序列的符号化序 列,或者符号化语句序列”。可以看出,稈序既可以指能被计算机直接执行的指令序列(可执 行文件),也可以是我们用程序设计语言编写的源程序,但源程序不能被计算机直接执行,必 须通过程序设计语言翻译为可执行的指令序列。0.1.2程序设计语言程序是由人来编写,程序的执

14、行实际上反映了人的设计思想。随着计算机技术的不断发展, “编程”技术也在不断地发展,程序设计语言经历了几个不同的阶段。1. 机器语言众所周知,数据是以二进制形式存储在计算机中,我们所能感知的声咅或图像进入计算机z前必须要经过编码转化为二进制。计算机能够执行的程序也不例外,也是以二进制代码表示指令序列。机器语言便是以二进制代码表示机器指令的一种语言,用机器语言写的程序能被计 算机直接执行。最早的计算机(如eniac)便是采用机器语言来编写程序,“程序员”采用手工拨钮开关 和纸带打孔的方式向计算机输入程序,那时的程序员都是一流的科学家。下面的程序段便是使 用x86计算机的机器语言编写的,功能是计算

15、1 + 1 o【例0.1】使用机器语言计算l + lo1011100000000001000000000000010100000001 00000000很明显,用这样的方式编写程序非常麻烦,人类很难读懂,而且不同的计算机提供的机器 语言不同,编写的代码很难通用。于是汇编语言应运而生。2. 汇编语言为了解决机器语言编程的困难,人们专门编写一种称为程序设计语言的程序,它提供一套 语言规范,程序员可以采用该语言编写“程序”,然后由程序设计语言将“程序”翻译为计算 机能够执行的程序。汇编语言便是最早的程序设计语言之一,用汇编语言编写1+1的代码如 例0.2所示。【例0.1】使用汇编语言计算1 + 1。

16、mov ax,1add ax,1上面的两行符号,计算机并不能直接执行,需要借助汇编编译器将它翻译成例0所示的 二进制机器代码。汇编语言屏蔽了枯燥的二进制代码,汇编语言用人类易懂的符号代替二进制 代码,使得编程技术前进了一大步。但汇编语言与机器语言比较接近,多数符号基本上和一组 二进制指令码直接对应,与计算机内部实现细节直接相关,编程的难度仍然较大。各种新的程 序设计语言不断诞生发展,人们习惯把机器语言和汇编语言称为低级语言,而把之后的程序设 计语言称为高级语言。3. 高级语言高级语言的出现是编程语言的一大进步,它屏蔽了机器的细节,语言更接近于口然语言和 数学语言,给编程带来了极大的方便。据不完

17、全统计,目前已经有超过2500种计算机语言, 绝大多数是高级语言。利用c语言计算1 + 1的代码如例0.3所示。【例0.3】使用c语言计算1 + 1#inlcude <stdio <h>main()printf (u%dn,z, 1 + 1);也许你还不懂这些符号和单词,但很快就会学会这些内容。高级语言易学、易用、强大, 具有一定的通用性。在例0.3中,如果想让计算机计算20-4,你可能已经猜到,将程序中的 printf(“de,l + l);更改为printf(“dn”,204);就这么简单。回过头来,如果要用机器语言或汇 编语言來计算20-4,恐怕你就不容易猜到了。0.2

18、 c语言的历史和发展高级语言门类繁多,c语言是其中影响最大、寿命最长的语言之一。本书便是教授大家利 用c语言编写计算机程序的。c语言的应用非常广泛,普通计算机使用的windows操作系统 基本上是用c语言编写的,用來进行文档处理的word. excel也是基本上用c编写的。c语 言同时具有高级语言和低级语言的特点,因此也被称为“中级”语言,使得c语言具有其它 语言无法相比的速度优势和灵活性,c的语法规则简单、灵活,使得它屏蔽了汇编语言复杂、 难以调试等缺点。下面介绍c语言产生发展的简单历史。20世纪60年代,贝尔实验室(bell laboratory)的ken thompson开始用汇编语言开

19、发 unix操作系统,当程序规模不断扩大时,他开始无法忍受汇编语言的难写、难读和难以维护, 便开始在bcpl程序设计语言的基础上,将其改造成b语言,使得b语言更适合于开发unix。 1971年,dennis m.ritchie开始和thompson合作开发unix, m.ritchie主要负责改进b语言, 后来便被命名为c语言。1973年c语言基本完成,thompson和ritchie用c语言重写了 unix系统,unix操作 获得了巨大的成功,c语言也因此获得广泛的应用。c语言本身也在不断发展,1989年,美国国家标准局(ansi: american national standards i

20、nstitute)发布了一个完整的c语言标准,被称为c89或ansi co 1990年,国际标准化组织 (iso: intemation organizaton for standardization)直接采用 了 c89,有的资料上称为 c90,实 际上c90和c89完全一样。1999年,iso发布了最新的c语言规范,被称为c99,是目前c 语言标准的最高版本。目前,有许多新程序设计语言正在兴起,如c+、java. c#等,它们借助面向对象程序设 计思想,大大提高了开发效率,获得了程序员们的认可,称为程序设计语言小的三大主流阵营。 在这样的形势下,仍然有一些程序员们在坚守c语言的阵营,他们追

21、求着c语言的运行高效 率和灵活性。0.3 一个简单程序的诞生在正式学习c语言编程规则之前,首先感受一下完整的c程序的的概貌,以及程序设计 语言的工作过程。0.3.1简单的c语言程序概貌下面的示例c程序,完成计算两个整数屮的最大值功能。【例0.4】计算两个整数的最大值include <stdio.h>/*getmax函数求两个整数中的最人值,两个参数类型为整型函数返回值类型为整数*/ int getmax(int a, int b)if (a>b)/*如果a比b的值大,则返冋a */return a;return b;void main()int x, y, max;print

22、f(please input two integers: u);scanf (''%d%d/ &x, &y) ;/*通过键盘输入两个整数*/max = getmax ( x, y ) ;/*求x、y中的最大值保存到mmx中/printf (uthe max number is: %dnz max);例0.4就是一个简单但完整的c语言程序,现在你可能还读不懂其中每个符号所代表的含 义,没关系,先对程序有一个轮廓的认识。运行程序时,屏幕上将显示一条提示信息:please input two integers:要求用户通过键盘输入两个整数。假设用户输入33和-4,即p

23、lease input two integers:33 -4/符号/表示按下回车键,33和-4之间空一个空格,也可以每输入一个数后按一下回车(以 后的示例均如此表示),输入后屏幕的提示结果为:the max number is: 331. c语言程序由函数构成函数(function)是构成c语言程序的基本单位,例0.4由getmax和main两个函数构成。 每个函数由函数首部和函数体构成,getmax的函数首部为"int getmax(int a, int b)v, main函 数的函数首部为“void main()";函数体便是函数首部之后的一对花括号“”之间的内容。 具

24、体的有关函数的知识请参照第五章内容。每个程序小有且只能有一个main函数,这个函数称为主函数,程序执行时,便从这个函 数体“对应”的第一条指令开始执行。一个c程序中可以包含多个自定义函数,也可以一个 没有,示例0.4屮的getmax函数便是自定义函数,main以外的函数均是自定义函数。2. 对库函数的引用编程时,如果所有的函数都要程序员自己编写,那工作效率一定很低,对于一些通用的功 能,多数编译器均提供了一组标准库函数。库函数的使用极大提高了编程效率,程序员可以在 自己的程序中调用库函数。耍调用系统提供的库函数,必须在程序中包含相应的头文件(header files),包含头文件 要用到编译预

25、处理指令,示例0.4屮所用的为:# include <stdio.h>stdio.h是最常用的需要包含的头文件,一般程序中均要包含这一头文件。要将计算结果输 出的屏幕上,需要调用库函数中的printf函数,从键盘让用户输入数据,需要调用库函数中的 scanf函数,它们都需要包含stdio.h:如果要调用数学函数,如计算正弦函数值的sin函数,则 要包含 math.h (具体格式为:#include <math.h>)o通常情况下,将头文件包含放在程序的最开始处。3培养良好的书写习惯c程序的函数体部分由语句构成,语句都是以分号作为结束符(反过來不成立,出现分号 的地方不一

26、定是一条语句的结束),编译预处理指令(如头文件包含)不是c语句,所以不能 在最后加分号,函数的定义前后也不能加分号。c的语句书写格式比较规范,可以在一行内书写多条语句,也可以将一条语句分开写在多 行上。但为了保证程序的可读性和调试改错的方便,应该养成良好的代码书写规范和习惯。一 般情况下,一行内只写一条语句,代码结构清楚,错落有致,希望大家在上机实践的时候,仿 照书中的例题来书写程序,养成良好的习惯。4.注释也很重要在例0.4屮,/*和勺之间的内容便是注释,注释是程序员对自己所编写程序的注释性说明, 可以采用中文也可以用英文,但一定要放在/*和勺之间,而且/和*之间不能有空格。编译器在 将程序

27、翻译为机器语言代码时,忽略所有的注释内容,也就是说注释对程序功能没有任何影响。 但注释却是编写程序时不可缺少的内容,清晰的注释记录了程序员编写程序时的思路和设计思 想,便于其他程序员或自己事后再来阅读这一段程序。规范化的程序设计提倡给程序加上必要 的注释。c语言的注释可以有两种方式,上述是第一种方式,放在严和勺之间,中间可以换行,也 就是说可以有较多的注释说明。另一种方式最早是c+语言引入的,目前大多数c编译器已 经支持,ansi c标准也已经引入,也称为行注释,用/引导,/之后到该行结束所有内容 都是注释。如:scanf (''%d%dz &x, &y) ;/

28、通过键盘输入两个整数本教材中,根据需要两种注释都使用。0. 3. 2第一个程序的诞生用高级语言编写的程序,计算机并不能直接运行,必须要借助编译程序将我们编写的代码 翻译为用0和1表示的机器语言指令代码,才能真正在计算机中执行。用c语言开发软件都要经历“编辑一编译一链接一运行”的过程。1.编辑源代码编辑阶段就是利用c语言编写实现特定功能的程序代码,通常将这一阶段的代码称为源 代码(source code),源代码必须遵循高级语言的规范,同时也人的智慧与思维的体现。本书 的其余章节都是讲解如何写好c语言源代码。一般将编写好的c语言源代码保存为文本文件,扩展名为.c,如例0.4的代码我们可以保 存为

29、 findmax.co2编译(compile)编译由编译器负责完成,编译器是一个事先开发好的软件,它专门用于将我们编写的源代 码翻译为计算机能够理解的二进制目标代码。能将c语言源代码翻译为二进制码的的编译器 有很多,常用的有turbo c microsoft c> borland c等。编译器是一种非常复杂的软件,不同 的编译器在翻译代码时的策略也不完全相同,同样的代码经不同的编译器翻译后的可执行文件 并不完全相同,所以在真正开始软件开发吋,首先要了解自己所选择的编译器。本书选用turbo c作为编译器,有关turbo c的操作请参照附录的说明。在编译阶段,编译器通常会发现源代码中不符合

30、语言规范的语法错误,程序员需耍修订这 些错误并重新编译直到编译成功。如果你输入的findmax.c没有语法错误,编译后将生成 findmax.obj,我们称之为目标文件。3链接(link)程序中除了自己编写的代码外,往往还需要调用库函数中提供的函数或者其他人编写目标 函数,链接过程便是将这些目标函数合并成有关完整的可执行文件。对于例0.4的findmax.c, 将生成findmax.exe, findmax.exe便可以在计算机上直接运行。目前大多数编译器都提供了集成的开发环境(ide: integrated development enviroment), 只要点击一下菜单,便可以连续完成编

31、译、链接过程(编译出错则不能完成链接),最后生成 一个可执行文件,一般不会觉察到链接过程的存在。4运行链接成功后得到的便是一个可执行程序,可执行程序便可以复制给别人去执行应用。可执 行程序生成后便和源代码脱离关系,可执行程序的执行并不需要源代码的存在。很多初学c 语言程序设计的人,总是认为是自己编写的源代码再执行(一点turbo c中的rim菜单项,程 序便执行),实际上应该是你编写的源代码被编译器翻译成的可执行程序在运行,当运行有错 误时,重新修改代码,重新翻译,重新运行。程序在运行时,将二进制指令代码和要处理的数据加载到内存中才能执行,要想了解可执 行文件的加载过程还需要进一步的学习,而源

32、代码只是存储在磁盘上的一个普通文件。由此可 见,真正执行的不是源代码,而是编译链接结果加载到内存后的二进制代码。5.小结:程序员、编译器、测试人员、用户在软件开发过程中,有非常重要的四个角色:程序员、编译器、测试人员和用户。程序员 是c语言源代码的撰写者,根据功能需求,按c语言语言规范编写源代码。源代码需要借助 编译器进行翻译,我们需要购买一个c语言编译器(如turbo c)安装到自己的机器上,执行 编译器提供的翻译功能,生成一个可执行程序。生成的可执行程序需要经过测试人员进行运行测试。测试无误后,将软件打包分发、销售给广大用户使用,用户是软件的使用者和收益者, 用户通过软件解决实际的问题。当

33、然在学习c语言编程的时候,我们既是程序员,同时也是测试人员和用户,但我们不 能混淆这儿个截然不同的角色。编写源代码时我们是程序员;编译时需要借助编译软件完成; 程序编写完成后要反复运行,查看有无功能上的缺陷或错误,此时我们便是测试员和用户。程 序员、测试员和用户应该是在不同的环境和场合下编写或程序,但在实际学习时,多个环节儿 乎都是在同一台机器的turbo c环境下完成的,容易造成错觉。大家在编写程序吋,要养成良好的编码习惯,编写的程序要界血友好,输入输出要有提示 说明,用户输入错误要有检测和提示。你编写的程序不一定只是你在运行,你的成果可能会拷 贝到别人的机器上执行,如果在输入数据时没有提示

34、,用户很难知道程序到底要干什么?在例 0.4中,在要求用户输入两个整数z前,通过prinlfplease i叩uuwo inlegers: “);向屏幕上打印 一行提示,非常直观,在上机实践时一定要遵循这一编码习惯。本章小结c语言是目前应用比较广泛的编程语言之一,本章简单介绍了程序及程序设计语言的基本 概念,介绍了 c程序设计语言的发展历史。c语言编写的源程序不能被汁算机直接执行,必须借助编译器将源代码编译链接为可执行 程序,才能被计算机识別执行。通过一个简单的示例,展现c语言源代码的概貌和编写c程 序的基本流程。复习题1、指令、程序和软件有什么区别?2、机器语言、汇编语言、高级语言各有什么特

35、点?3、简述c语言编程的基本过程。4、简述c程序的基本结构。5、程序员、编译器、测试人员、用户在软件开发过程屮各自的职责是什么?第1章c程序设计基础知识程序的最后执行需要将可执行代码及待处理的数据加载到内存中,计算机内存中要为可执 行代码留出保存空间,还要为待处理的数据留出相应的空间,很多场合下,要处理的数据占用 的空间要比可执行代码占用的空间要多。现实生活中有自然数、整数、小数等概念,不同类型 数的精度是不一样的。在计算机内存中,也要区分所保存数据的类型,如整数、浮点数、字符 数据等,不同类型数据所占用的内存空间(即占用的字节数)是不一样的。大多数高级语言在源代码中都要用声明语句对程序中将要

36、处理的数据进行变量定义,其目 的就是为不同类型的数据开辟不同的存储空间,便于进行处理与存储。本章从数据基本类型开始,介绍变量定义、基本运算符及表达式语法,是c语言编程中 的基础知识。1.1变量c语言的数据类型比较丰富,整体上可划分为基本类型、构造类型以及空类型,基本类型 包括整型、浮点型(进一步区分为单精度和双精度类型)、字符型、枚举类型和指针类型,构 造类型有数组、结构体和共用体。本节将重点讨论最基本的整型数和实型数以及定义整型和实 型变量的定义方法。1.1.1有关内存的基础概念内存由能存储信息的介质组成,它们划分为众多的存储单元,每个存储单元可以存储一个 字节或8个二进制位,可以将存储单元

37、理解为由8个微小开关构成,每个开关可以表示一个二 进制位,将指令和数据送入存储器,只不过是打开一些开关而合上另外一些开关。内存包含众 多的存储单元,为了识别它们,从0开始顺序为它们编号,编号称为某个存储单元的地址,表 示这一存储单元在内存中的位置(很多吋候用相对位置的概念)。存储单元的地址反映的是位 置信息,存储单元的内容是8个二进制数。磁盘、光盘、cpu中的寄存器等存储器的基本原理与内存相似,只不过各自的存储介质 不同而已。1.1.2变量的引入程序运行过程中,经常需要保存用户输入的数据、计算的中间结果以及最终计算结果,因 此在c语言中引入了变量的概念,用來存放值可以变化的数据。顾名思义,变量

38、对应的数据可以被读出来参与计算,也可以将计算结杲写入某个变量对应的存储空间。c语言中每个变量要具备3个要素:变量的名称、变量的数据类型、变量的值。1.标识符命名规则c程序中经常要为函数、变量等起一个符号化的名称,这些符号称为标识符,标识符的命 名必须遵循一定的规则。(1)标识符只能由英文的字母、数字和下划线构成,标识符不能以数字打头,第一个 字符只能是字母或下划线。(2)c语言的关键字不能作为标识符,c语言总共有32个关键字,见表1-1。需要注 意的是,不同的c编译器,支持的关键字略有不同。(3)c语言中的标识符区分大小写,如sum和sum是两个不同的标识符。(4)在c语言中,标识符长度可以不

39、受限制,但旧的ansi c规定,只有前6个字符 有意义,也就是说编译器只看标识符的前6个字符,新的c和c+编译器打破了 这一限制,但不同的编译器还是有一个长度限制。(5)标识符命名要养成良好的习惯和一致的风格,尽量做到“见名知义”,尤其当程序 代码增多时,不好的标识符命名将使得代码难以阅读,也很难维护。这一条不是 硬性规定,但应该从一开始就要养成良好的习惯。表11 c语言的关键字表autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsiz

40、eofstaticstructswitchtypedefunionunsignedvoidvolatilewhile2.变量的名字变量的名字可以根据需要由程序员指左,除了要遵循标识符的规定,还应该注意以下的规则。(1)在同一个函数体内,不要定义同名的两个变量。在turbo c中,所有变量的定义 语句必须放在函数体的最开始处,变量定义要遵循“先定义后使用”的原则,否 则会出现编译错误。(2)尽量避免定义与库函数中函数名同名的变量,如prints scanf等,虽然不会出现 语法错误,但容易造成混乱。下面的变量名是合法的变量名:total_money> _mycar、averagescore

41、class_l,也是比较 好的变量命名,变量名中最好用英文单词表达变量的含义,有的系统推荐使用下划线分隔单词, 有的推荐使用单词首字母大写来区分,尽量使用统一的风格,避免多种方法混杂在一起。下面 的变量命名虽然合法,却不是很好的命名习惯:al、a2、xyz等。而下面的变量命名则是不合 法的:l_class、total+moneny my二car、into3. 变量的定义方法变量定义的基本语法格式为:变量类型变量名列表;其川变量类型确定了变量所要存储数据的类型,如整型、实型等,变量名列表列出多个需 要定义的变量的名称(也可以一次只定义一个变量),变量名之间用逗号(一定不要使用中文 逗号)分隔。【

42、例1.1】变量的定义int english_score;int math_score, total_score;double average_score;float _height;char _mychar;定义整型变量使用关键词int,定义单精度实数用关键词float,定义双精度实数使用关键 字double, double类型数据比float类型数据有更高的存储精度。在这些基木类型关键词之前, 还可以加一些修饰符,如short> long、signedunsigned等,以确定更加具体的类型,具体的 用法稍后再介绍。变量定义的同时还可以为变量指定初始值,如int a=5;04. 变量与

43、存储单元的探讨程序员在源代码中定义的变量,是程序设计语言屮特有的概念,经编译器编译生成的可执 行程序加载到内存中时,并没有变量的概念,变量名被编译器翻译为某个存储单元的“地址”, 即它在内存中的位置。回顾一下例0.4中求两个整数中的最大值的程序,用户通过键盘输入两 个整数,两个整数存储在内存中某些存储单元,之后需要引用这两个整数的值,在程序的运行 阶段,是通过指定数据在内存中的位置来进行访问的,这个位置市编译器和系统加载可执行程 序时共同确定。而程序员在编写源代码的时候,很难知道数据将来会放在内存的什么地方,为 了屏蔽这一细节,我们用定义变量的方式来解决这一问题,定义的变量将来会放在内存的什么

44、 地方这一复杂问题交由编译器来解决。由此必须明确,变量是为了编程的方便而提出的概念, 我们只需通过变量名即可引用变量将来所对应存储单元的值,作为编程人员,可以简单地将变 量和其将来所对应的存储单元等同起来。5. 变量类型与占用的存储空间定义变量需要指定变量的类型,变量的类型决定了在加载可执行程序时,系统将要为它在 内存中开辟多少个字节的存储空间,这一工作由编译器和操作系统联合完成。同样当需要访问 变量所对应的数据时,系统将根据变量的类型从某个位置开始(变量编译后的地址),连续取 若干个字节的内容并解释为该类型的数据。通俗地讲,变量对应的是一组存储单元,变量的值 是这些存储单元屮的二进制位组成的

45、数。不同的系统、不同的编译器中,某种数据类型占用的存储空间并不一样。表12以turbo c 和常见的x86为例,列出常用的整型、实型和字符型变量类型将占用的存储空i'可,若读者使用 不同的开发环境,请参照具体的文档说明。表1-2不同类型数据占用存储空间情况类型说明占用 字节数取值范围备注int整型2-32768-32767-2,542,5-1)signed带符号整型,与ini等价short int短整型,与int等价short短整型,与int等价singned short int带符号短整型,与int等价unsigned int无符号整型20655350 (2®1)unsig

46、ned short int无符号短整型,与无符号整型等价long int长整型4-2147483648-214748364723l(23,-1)long长整型,与long int等价signed long int带符号长整型,与long int等价unsigned long int无符号长整型4042949672950(2辺1)float单精度型43.4x10陷3.4x10并7位有效位double双精度型8-1.7x 103081.7x 1030815位有效位long double长双精度型10-3.4 x 10°9323.4>< 10493219位有效位char字符型1

47、-128-127 27427-1)signed char带符号字符型,与char等价unsigned char无符号字符型10-2550(2匚 1)关于不同类型数据占用存储空间的几点说明:(1)signed (带符号型)和unsigned只能修饰char和int型,因为double和float型必 须为带符号型,不能再修饰。char和int型默认情况下就是signed类型,可以说 signed关键词总是可以省略。(2)short只能修饰int型,在turbo c中,short修饰符也总是可以省略的。(3)long可以用来修饰int和double, long int用来表示更多位数的整数,lon

48、g double 表示精度更高的双精度实数。单很多编译器并没有实现long double数据类型。(4)int型占用存储空间在不同编译器之间变化是最为无常的,在实际编程时,虽然可 以省略诸如short z类的修饰符,但最好加上,以增加程序的可移植性。(5)char型变量用于存储一个西文字符。但读者要注意,chai变量中存储的是对应字 符的ascii码。(6)某种类型的数据所能表示的数值范围是一定的,如ini型变量占两个字节(16位 二进制),最高位为符号位,所能表示的整数范围为-3276832767,如果将大于 32767或小于-32768的整数赋值给某个整型变量,则会发生错误,称为溢出。例

49、1.2展现了整型变量的溢出。【例1.2】整型变量的溢出#include <stdio.h>void main()unsigned int bad_int; bad_int=65536;printf (''the result is : %dn,z, bad_int);程序的输出结果为:the result isoo badjnt是无符号类型,所以65535在内存中的表示形 式如图1-1所示。1111111111111111图1-165535在内存中的示意图0000000000000000图1-2 0在内存屮的示意图当将65535加1变为65536时,内存中的存储形式

50、变为图12所示,它正好是0的存储形 式。int型变量的表示范围为065535,在所能表示的最大数基础上加1,该变量就变为可表示 范围内的最小值,这一点非常类似钟表的钟点,过了 12点,便又从0点开始。数据在内存屮均以补码的形式存储,无符号数的原码与反码相同,只能表示正数。对于带 符号数,表示整数的16位二进制中的最高位为符号位,1表示负数,0表示整数,数据同样以 补码的形式存储,带符号整型数的取值范禺为-3276832767, 32768按整数输出将输ii!-327680 具体的验证过程,请读者自行完成。所以在程序设计过程中,应充分考虑数据的变化范围,以选择合适的数据类型来存储数据, 避免由于

51、溢出而导致的程序运行错误,这一类错误是很难被发现的。1.2常量程序川除了需要定义变量用于开辟存储空间、存储数据,我们还需要一些在程序运行过程 中保持不变的数据,如圆周率3.1415926、税率、万有引力常数等等,常量也有数据类型,常 量的类型也决定了该常数占用的存储空问。常量可区分为字面常量、符号常量和const常量,字面常量是程序代码中直接书写的数值, 经编译后被嵌入在代码中,称为立即数,程序运行时直接参与运算;符号常量与字面常量类似, 但有一个易于理解的符号名称;const常量与变量类似,程序加载时,需要为const常量开辟存 储空i'可,const常量有特定的数据类型,有符号化的

52、名称,只是在程序运行过程中,常量的值 不能被修改。1.2.1字面常量在书写源程序时,经常要直接书写数值常量,本节重点介绍不同类型字面常量的书写规范 和格式。1. 整型常量在c语言中可以用十进制、八进制或十六进制书写整型常量。(1)默认方式为十进制,可以包含09的数字以及表示负数的号,不能以0开头。 如0、128、23等。(2)八进制整型常量,在正常数值前加上0作为前缀,数字由07构成,如012 (相 当于十进制的10)、-048 (相当于十进制的-40)o(3)十六进制整型常量,在正常数值前加上ox或0x作为前缀,数字由09、af、 af构成,如0x12 (表示十进制的18)、-0x7b (表

53、示十进制的123)。(4)整型常量默认的类型为int型,如果要表示长整型整数常量,可以在正常数字后加 一大写或小写的l作后缀,如129l、1391、0x7al等。(5)默认情况下,整型常量为带符号常量,如果要表示无符号整型常量,可以在数据 后面加上大写或小写的u作为后缀。如123u、3456ul等。2. 实型常量实型常量只能用十进制表示,有小数方式和指数方式两种表示方法。(1)小数方式,与正常书写的小数类似,如3.1415>2.、.345、0.0等。(2)指数方式,由小数部分、代表指数的e或e、指数三部分构成,指数为带符号整 数,e或ez前必须有数字。合法的科学表示小数有1.23456e

54、4、12.3456e3,它 们均表示十进制的12345.6。而1.2e2.3、.e2、e4均不是合法的常量。(3)默认情况下,实型常量为双精度类型,在实型常量之后加上f或f作为后缀表示 数据类型为单精度类型,在实型常量之后加上l或1作为后缀表示数据类型为长 双精度类型,但这一类型在很多编译器中并未实现。3. 字符常量c语言中的字符常量是由一对单引号括起来的一个字符,女lx, z #等。字符常量两 侧的单引号是必须的,注意s和5两个不同的对象,5,表示字符5,而5表示整数的数字5, 请读者不要混淆。大多数字符常量都可以通过加单引号的方式表示,但有些特殊字符,如单引号本身和有些 不可见的特殊字符,

55、就无法通过这种方式表示。为了解决这一问题,c语言引入“转义字符”, 用“”加若干字符的形式来表示有些特殊的字符,常见的转义字符如表23所示。字符含义字符含义打,换行'a'响铃报警回车(不换行)一个单引号't'水平制表符一个双引号'v,垂直制表符一个反斜线,b,退格问号走纸换页'ddd'1-3位八进制ascii码代表的字符0,空字符,标志字符串结束'xhh'1-2位十六进制ascii码代表的字符上表中,n'表示回车,在前血的程序中大家都已经见过了,用于输出吋将光标移到下一行的起始位置。'w仅仅将光标移动到当前行的起始位置jo,表示的是ascii码值为o的字符, 该字符是不可见字符,往往用于标识字符串的结束。4. 字符串常量字符串常量是由一对双引号括起來的多个字符,如"hello”、"犷。同学们一定要区分字符 串和字符的概念,在c语言中字符串常量除了包含双引号中的所有字符,还隐含一个特殊字 符9,如实际包含f和,(t两个字符,其pq用来标识一个字符串的结束,输岀时没有任 何显

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论