C语言程序设计王曙燕主编曹锰副主编北京责任编辑:万国清韩洁/责任校对:都岚责任印制:吕春珉/封面设计:飞天创意出版北京东黄城根北街16号邮政编码:100717http://www.
sciencep.
com中国科学院印刷厂印刷科学出版社发行各地新华书店经销*2005年2月第一版开本:787*10921/162005年2月第一次印刷印张:221/4印数:1-4000字数:504000921/16定价:30.
00元(如有印装质量问题,我社负责调换)销售部电话:010-62136131编辑部电话:010-62135120-8001内容简介本书共13章,主要内容包括C语言的基本概念、基本语法和基本数据结构,另外,给出了一个小型超市管理的综合实例,介绍了C语言图形程序设计的基本方法,还简单介绍了C++、VisualC++和C#等面向对象程序设计语言.
本书注重应用性和实践性,通过一些典型算法的解题分析及其实现给读者一些解题示范和启发.
每章后面配有习题,附录中有上机实验题目和上机实验指导.
本书可作为高等院校各专业C语言程序设计课程的教材,也可供准备参加计算机等级考试和考研的读者阅读参考,同时也可作为工程技术人员和计算机爱好者的参考资料.
图书在版编目(CIP)数据C语言程序设计/王曙燕主编.
—北京:科学出版社,2005(面向21世纪大学计算机基础课程规划教材)ISBN7-03-014884-3Ⅰ.
C…Ⅱ.
王…Ⅲ.
C语言-程序设计-高等学校-教材Ⅳ.
TP312中国版本图书馆CIP数据核字(2005)第003325号·i·面向21世纪大学计算机基础课程规划教材编委会主任冯博琴西安交通大学副主任崔杜武西安理工大学编委(以姓氏笔画为序)王长元王会燃刘天时张毅坤郝平蒋林·i·前言C语言程序设计是理工科各专业计算机应用能力培养的重要技术基础.
C语言既具有低级语言可直接访问内存地址、能进行位操作、程序运行效率高的优点,又具有高级语言运算符和数据类型丰富、结构化控制语句功能强、可移植性好的优点,成为程序设计语言的常青树.
通过本课程的学习,学生可以掌握C语言的程序结构、语法规则和编程方法,达到独立编写常规C语言应用程序的能力,同时为设计大型应用程序和系统程序打下坚实的基础.
本课程是数据结构、面向对象程序设计、操作系统和软件工程等课程的基础,并可为这些课程提供实践工具.
本书以程序设计为主线,全面介绍C语言的基本概念、基本语法和基本数据结构.
第1、2章介绍了C语言的特点和C语言的基本概念;第3~5章讨论了算法的描述和结构化程序设计的基本方法以及三种基本结构(顺序结构、选择结构和循环结构);第6章介绍了函数的定义和使用;第7~9章介绍了数据的构造类型(包括数组、字符串、结构体和共同体等)和指针类型;第10和11章介绍了编译预处理和文件的概念,并给出了一个小型超市管理的综合实例;第12章介绍了C语言图形程序设计;第13章介绍了面向对象程序设计语言C++、VisualC++和C#等.
C语言是一门实践性很强的课程,对学生的编程和调试能力的训练非常重要.
在第3章、第5章和附录Ⅰ、附录Ⅵ、附录Ⅶ中,专门介绍了C语言的上机步骤和C程序的调试技术,给出了上机实习题目及要求,并重点介绍了TurboC2.
0集成环境.
在第13章中也介绍了C++和VisualC++的上机步骤和环境,便于有能力和兴趣的读者在Windows环境下编写C程序.
本书中的例题均经过TurboC2.
0运行环境的调试.
本书讲授时数为60~70学时,其中实验课占24学时.
学习完本教材后,应安排两周的"课程设计",以完成一个小型应用系统的设计与实现.
王曙燕任主编,编写了第1、3和5章,曹锰任副主编,编写了第7、8和9章,刘鹏辉编写了第10、12章,王春梅编写了第4、11章和附录,王小银编写了第2、6章,周元哲编写了第13章.
曹锰、王春梅、王小银和舒新峰老师参与了审校,最后由王曙燕统稿.
陈莉君对教材的编写也提出了很好的建议.
作者在此一并向他们表示衷心的感谢.
本书可作为大专院校各专业C语言程序设计课程的教材,也可供准备参加计算机等级考试和考研的读者阅读参考,同时也可作为工程技术人员和计算机爱好者的参考资料.
由于编者水平有限,书中难免存在缺点和错误,恳请专家和读者批评指正.
作者联系方式:wsyly@sina.
com.
王曙燕2004年8月·iii·目录第1章概述11.
1程序设计语言·11.
1.
1计算机语言11.
1.
2程序设计语言的发展·11.
2C程序设计语言21.
2.
1C语言的发展历史21.
2.
2C语言的标准与版本31.
2.
3C语言的特点31.
3C语言的基本语法成分41.
3.
1字符集41.
3.
2标识符41.
3.
3运算符61.
4C语言程序的组成61.
4.
1简单的C程序介绍·61.
4.
2C语言程序的结构·81.
4.
3C程序的书写9习题110第2章基本数据类型、运算符及表达式112.
1C的基本数据类型112.
1.
1数据类型·112.
1.
2C语言数据类型简介112.
1.
3C的基本数据类型·122.
2常量·132.
2.
1整型常量·132.
2.
2实型常量·132.
2.
3符号常量·142.
2.
4字符型常量·142.
3变量·162.
3.
1变量名162.
3.
2变量类型·162.
3.
3变量值172.
4运算符及表达式·172.
4.
1C运算符简介172.
4.
2算术运算符与算术表达式18·iv·2.
4.
3赋值运算符与赋值表达式212.
4.
4逗号运算符和逗号表达式232.
4.
5不同类型数据间的混合运算与类型转换24习题225第3章算法和基本程序设计·273.
1算法·273.
1.
1算法的概念273.
1.
2算法的评价标准·283.
1.
3算法的表示293.
2结构化程序设计的方法313.
3程序的基本结构·313.
3.
1顺序结构·323.
3.
2选择结构·323.
3.
3循环结构·333.
4顺序结构程序设计·343.
5数据的输入与输出·353.
5.
1C语言中数据的输入与输出·353.
5.
2字符数据的输入与输出363.
5.
3格式输入与输出·383.
6C程序的上机步骤443.
6.
1C程序的上机步骤443.
6.
2TurboC2.
0简介45习题347第4章选择分支结构程序设计·484.
1关系运算·484.
1.
1关系运算符484.
1.
2关系表达式484.
2逻辑运算·494.
2.
1逻辑运算符494.
2.
2逻辑表达式504.
3二路分支——if语句·514.
3.
1if语句的一般形式·514.
3.
2if语句的嵌套564.
4条件运算符与表达式·584.
5多路分支——switch语句·584.
5.
1switch语句的一般形式·584.
5.
2switch语句的嵌套604.
6选择分支结构程序举例60习题464·v·第5章循环结构程序设计·665.
1while语句·665.
2do-while语句·685.
3for语句·705.
4goto语句·735.
5循环的嵌套·745.
6break和continue语句765.
6.
1continue语句765.
6.
2break语句775.
7循环结构程序举例·795.
8C程序的基本调试技术82习题583第6章函数856.
1概述·856.
1.
1C程序基本结构·856.
1.
2函数分类856.
2函数的定义·866.
3函数的参数和函数的返回值886.
3.
1形式参数和实际参数·886.
3.
2函数的返回值·896.
4函数的调用·906.
4.
1函数调用的一般形式·906.
4.
2函数调用的方式·916.
5函数声明和函数原型·926.
6函数的嵌套调用·936.
7函数的递归调用·956.
8变量的作用域·986.
8.
1局部变量·986.
8.
2全局变量·996.
9变量的存储类型·1016.
9.
1静态存储方式和动态存储方式·1016.
9.
2静态局部变量1016.
9.
3自动变量1026.
9.
4寄存器变量·1036.
9.
5静态全局变量和非静态全局变量1046.
9.
6存储类型小结1056.
10内部函数和外部函数·1066.
10.
1内部函数·1066.
10.
2外部函数·106·vi·6.
11多文件程序的运行107习题6108第7章数组1127.
1一维数组·1127.
1.
1一维数组的定义和初始化·1127.
1.
2一维数组元素的引用·1137.
1.
3一维数组应用举例·1147.
2二维数组·1177.
2.
1二维数组的定义和初始化1177.
2.
2二维数组元素的引用·1187.
2.
3二维数组应用举例1197.
3字符数组·1257.
3.
1字符数组的定义和引用1257.
3.
2字符数组的输入输出·1267.
3.
3字符串处理函数·1287.
3.
4字符数组应用举例1317.
3.
5容易出的错误·133习题7134第8章结构体与共用体·1378.
1结构体类型定义·1378.
2结构体变量·1388.
2.
1结构体变量的定义与初始化·1388.
2.
2结构体变量的引用1408.
3结构体数组·1428.
3.
1结构体数组的定义与初始化·1428.
3.
2结构体数组元素的引用·1438.
4结构体和函数·1458.
4.
1结构体作函数参数1458.
4.
2返回值为结构体类型的函数·1468.
5共用体·1478.
5.
1共用体类型定义·1478.
5.
2共用体变量定义与引用·1488.
5.
3共用体应用举例·1508.
6枚举类型·1528.
7typedef语句·154习题8155第9章指针1579.
1地址和指针的概念·1579.
1.
1变量的地址·157·vii·9.
1.
2直接访问和间接访问1589.
1.
3指针的概念·1589.
2指针变量·1599.
2.
1指针变量的定义1599.
2.
2指针变量的引用1609.
2.
3实现引用传递·1629.
3指针与数组·1659.
3.
1指向数组元素的指针·1659.
3.
2指针数组1739.
3.
3多维数组和指向分数组的指针1769.
4结构体与指针·1819.
4.
1指向结构体的指针变量·1819.
4.
2用指向结构体的指针作函数参数1829.
5指针与函数·1839.
5.
1返回值为指针类型的函数·1839.
5.
2指向函数的指针和函数参数1849.
6指针与链表·1879.
6.
1存储空间的分配和释放·1879.
6.
2动态数据结构——链表·188习题9195第10章编译预处理及位运算·19810.
1文件包含处理——#include·19810.
2宏定义——#define20010.
2.
1不带参数的宏定义·20010.
2.
2带参数的宏定义·20110.
3条件编译·20310.
4位运算符和位运算·20410.
5位段·20610.
6位运算举例·208习题10209第11章文件21311.
1文件的概述·21311.
1.
1文件的概念及分类21311.
1.
2文件的操作流程·21411.
1.
3文件缓冲区21511.
2文件类型的指针·21511.
3文件的打开与关闭21611.
3.
1打开文件fopen函数·21611.
3.
2文件关闭函数fclose218·viii·11.
4文件的顺序读写·21811.
4.
1字符读写函数fgetc和fputc21911.
4.
2字符串读写函数fgets和fputs22211.
4.
3格式化读写函数fscanf和fprintf·22411.
4.
4数据块读写函数fread和fwrite·22511.
5文件的随机读写·22811.
5.
1rewind函数·22811.
5.
2fseek函数22911.
5.
3ftell函数·23011.
6其他读写函数·23011.
7出错的检测·23111.
7.
1feof函数23111.
7.
2ferror函数23211.
7.
3clearerr函数·23211.
8程序举例·233习题11·245第12章C语言图形程序设计·24612.
1概述·24612.
2图形模式的初始化和检测函数24612.
3基本绘画·24912.
3.
1画点函数和定位函数·24912.
3.
2画线函数和设定线型函数25012.
3.
3画圆和椭圆函数·25212.
4图形填充·25312.
4.
1设定填充方式函数·25312.
4.
2图形填充函数25412.
5图形模式下的文本输出25512.
5.
1文本字符的输出函数25612.
5.
2字体格式和输出方式的设置25612.
6视口和视口函数·25812.
7屏幕操作·26012.
7.
1屏幕颜色的设置·26012.
7.
2cleardevice()清屏函数26112.
7.
3激活页函数26112.
7.
4图像处理函数26212.
7.
5键盘对屏幕的控制操作·264习题12265第13章面向对象程序设计简介·26913.
1面向对象程序设计·269·ix·13.
1.
1面向对象程序设计的产生背景26913.
1.
2面向对象程序设计的基本术语27013.
1.
3面向对象的软件开发过程·27313.
2Windows编程基础知识·27613.
2.
1事件驱动的概念·27713.
2.
2句柄27813.
2.
3Windows下的消息机制27813.
2.
4Windows应用程序的基本组成28113.
3C+28113.
3.
1C++的起源与发展·28113.
3.
2C++语言的特点28113.
3.
3I/O流、注释和书写格式·28213.
3.
4编写与运行你的第一个C++程序——HelloWorld.
cpp·28313.
4VisualC+28413.
4.
1MFC概述·28413.
4.
2MFC消息映射的工作方式28513.
4.
3用AppWizard生成程序框架·28613.
4.
4一个完整的Windows应用程序·28913.
4.
5如何获取帮助29313.
5C#29413.
5.
1Microsoft.
Net简介29413.
5.
2C#的特点·29613.
5.
3C#的编译流程·29613.
5.
4一个简单C#程序·297习题13300附录301附录I上机实验301附录II常用字符与ASCII码对照表309附录ⅢC语言中的关键字表·312附录IVC语言中的运算符的优先级与结合性一览表·312附录VC库函数313附录VITurboC2.
0菜单介绍·321附录VIITurboC2.
0编译错误信息介绍·333主要参考文献·339·1·第1章概述计算机技术正在日新月异地迅猛发展,广泛应用于社会生活的各个领域,成为大众化的现代工具.
人们用计算机解决问题时,必须用某种"语言"来和计算机进行交流.
具体地说,就是利用某种计算机语言提供的命令来编制程序,并把程序存储在计算机的存储器中,然后利用这个程序来控制计算机的运行,以达到解决问题的目的.
这种用于编写计算机可执行程序的语言称为程序设计语言.
目前已发明的计算机程序设计语言有上千种,无论什么样的计算机语言,其程序设计的基本方法都是相同的.
本书将以国际上广泛流行的C程序设计语言为例,介绍程序设计的基本概念和基本方法.
1.
1程序设计语言1.
1.
1计算机语言计算机语言是人们描述计算过程(即程序)的规范书写语言.
程序是对计算机处理对象和计算规则的描述.
语言的基础是一组记号和语法规则.
根据语法规则由记号构成记号串的全体就是语言.
人类是使用像英语、汉语这样的自然语言相互交流和表达思想的.
人与计算机如何"交流"呢人和计算机交流也要用人和计算机都容易接受和理解的语言,这就是计算机语言.
计算机语言是根据计算机的特点而编制的,是计算机能够"理解"的语言,它是有限规则的集合.
计算机语言不像自然语言那样包含复杂的语义和语境,而是用语法来表达程序员的思想,所以编写程序时必须严格遵守语法规则.
1.
1.
2程序设计语言的发展计算机是一种具有内部存储能力、由程序自动控制的电子设备.
人们将需要计算机做的工作写成一定形式的指令,并把它们存储在计算机的内部存储器中.
当人们需要结果时就向计算机发出一条简单的命令,计算机就按指令操作顺序自动进行.
人们把这种可以连续执行的一条条指令的集合称为程序.
也就是说,程序是计算机指令的序列,编制程序的工作就是为计算机安排指令序列.
程序设计语言伴随着计算机技术的发展层出不穷,从机器语言到高级语言,从面向过程的语言到面向对象的语言.
至目前为止,计算机语言的发展大致经历了五代.
第一代也称机器语言,它将计算机指令中的操作码和操作数均以二进制代码表示,是计算机能直接识别和执行的语言.
它在形式上是由"0"和"1"构成的一串二进制代码,每种计算机都有自己的一套机器指令.
机器语言的优点是无需翻译,占用内存少、执行速度快.
缺点是随机而异,通用性差,并且因指令和数据都是二进制代码形式,难于阅读和记忆,编码工作量大,难以维护.
·2·第二代语言也叫汇编语言,是用助记符号来表示机器指令的符号语言.
如用ADD表示加法,用SUB表示减法,用变量取代各类地址,这样构成的计算机符号语言称为汇编语言.
用汇编语言编写的程序称为汇编语言源程序.
这种程序必须经过翻译(称为汇编),变成机器语言程序才能被计算机识别和执行.
汇编语言在一定程度上克服了机器语言难于辨认和记忆的缺点,但对于大多数用户来说,仍然不便于理解和使用.
第三代语言即高级语言,也称为面向过程的语言.
高级语言是具有国际标准的,描述形式接近自然语言的计算机语言.
它采用了完全符号化的描述形式,用类似自然语言的形式描述对问题的处理过程,用数学表达式的形式描述对数据的计算过程.
常用的计算机高级语言有Basic、Fortran、Cobol、Pascal和C语言等.
由于高级语言只是要求人们向计算机描述问题的求解过程,而不关心计算机的内部结构,所以把高级语言称为面向过程的语言.
使用面向过程的语言编程时,编程者的主要精力放在算法过程的设计和描述上.
第四代语言又叫非过程化语言,是一种功能更强的高级语言.
主要特点是:非过程性、采用图形窗口和人机对话形式、基于数据库和"面向对象"技术.
易编程、易理解、易使用、易维护.
但是,程序的运行效率和语言的灵活性不如过程化语言高.
常用的非过程化语言有VisualBasic、Java、VisualC++和Delphi等.
如果说第三代语言要求人们告诉计算机"怎么做",那么第四代语言只要求人们告诉计算机"做什么".
第五代语言也称智能化语言,主要使用在人工智能领域,帮助人们编写推理、演绎程序.
目前,国内外大多数计算机上运行的程序,大多是用第三代或第四代计算机语言编写的.
因此,应当熟练地掌握用高级语言编写程序的方法和技巧.
由于面向过程的语言是程序设计的基础,所以,本书将以面向过程的C语言为背景,介绍程序设计的基本概念和基本方法.
在本书最后一章,将简单介绍面向对象程序设计的基本方法及流行的面向对象程序设计语言C++、VisualC++和C#.
1.
2C程序设计语言1.
2.
1C语言的发展历史C语言是国际上流行的,使用最广泛的高级程序设计语言.
它既可用来写系统软件,也可用来写应用软件.
C语言具有语言简洁紧凑,使用方便灵活及运算符丰富等特点、它具有现代化语言的各种数据结构,有结构化的控制语句,并且语法限制不太严格,程序设计自由度大,能实现汇编语言的大部分功能.
另外,C语言生成目标代码质量高,不仅程序执行效率高,而且程序可移植性好.
C语言的产生基于两个方面的需要.
一是为满足UNIX操作系统开发的需要.
UNIX操作系统是一个通用的、复杂的计算机管理系统;二是为拉近高级语言与硬件之间距离的需要.
C语言集高级语言与汇编语言优点于一身.
C语言面对实际应用的需要而产生,直至今日仍不改初衷.
C语言是从BCPL(basiccombinedprogramminglanguage)语言和·3·B语言演化而来的.
1960年出现的ALGOL语言是一种面向问题的高级语言,远离硬件,但不适于开发系统软件.
1963年,英国剑桥大学推出CPL语言,CPL语言比ALGOL语言接近硬件一些,但规模较大,难以实现.
1969年,剑桥大学的M.
Richards对CPL语言进行简化,推出BCPL语言.
1970年,贝尔实验室的K.
Thompson为DEC公司PDP[CD*2]7计算机上运行的一种早期UNIX操作系统设计了一种类BCPL语言,称为B语言.
B语言规模小,接近硬件,1971年在PDP-11计算机上实现,并用B语言编写了UNIX操作系统和绝大多数实用程序.
由于B语言面向字存取、功能过于简单、数据无类型和描述问题的能力有限,而且编译程序产生的是解释执行的代码,运行速度慢,因此没有流行起来.
1972~1973年,贝尔实验室的D.
M.
Ritchie在保留B语言优点的基础上,设计出一种新的语言.
这种新语言克服了B语言功能过于简单、数据无类型和描述问题的能力有限的缺点,扩充了很多适合于系统设计和应用开发的功能.
因为这种新语言是在B语言的基础上开发出来的,不管是在英文字母序列中也好,还是在BCPL这个名字中也好,排在B后面的均为C,因此将这种语言命名为C语言.
1973年,UNIX操作系统被用C语言改写,称为UNIX第五版.
最初的C语言只是一种UNIX操作系统的工作语言,依附于UNIX系统,主要在贝尔实验室内部使用.
UNIX以后的第六版、第七版、SYSTEMⅢ和SYSTEMⅤ都是在第五版的基础上发展起来的,C语言也做了多次改进.
到1975年,随着UNIX第六版的公布,C语言越来越受到人们的普遍注意.
UNIX操作系统的广泛使用,促进了C语言的迅速发展与普及.
同时,C语言的发展与普及也促进了UNIX操作系统的推广.
到1978年出现了独立于UNIX和PDP计算机的C语言,从而,C语言被迅速移植到大、中、小与微型机上.
当年,B.
W.
Kernighan和D.
M.
Ritchie以UNIX第七版的C编译程序为基础,出版了影响深远的名著《C程序设计语言》.
如今,C语言已经风靡全球,成为世界上应用最广泛的程序设计语言之一.
1.
2.
2C语言的标准与版本随着C语言的普及,各机构分别推出了自己的C语言版本.
某些执行过程的微小差别不时引起C程序之间的不兼容,给程序的移植带来很大的困难.
美国国家标准协会(ANSI)从1983年开始,经过长达5年的努力,制定了C语言的新标准——ANSIC.
现在提及C语言的标准就是指该新标准.
ANSIC比原标准C有很大的发展,解决了经典定义中的二义性,给出了C语言的新特点.
任何C程序都必须遵循ANSIC标准,本教材也以ANSIC作为基础.
尽管这样,各种版本的C编译系统还是略有差异,因此,读者在使用具体的C语言编译系统时,还应参考相关的手册以了解具体的规定.
C语言有多种版本:TC2.
0,BC3.
1,BC5.
0和VC6.
0等,最新的是为Windows和Web应用程序提供动态开发环境的VisualC++、.
NET(C#).
1.
2.
3C语言的特点C语言的主要特点有:(1)C语言简洁、紧凑,编写的程序短小精悍C编译程序的代码量较小,便于在微型机上应用.
·4·(2)运算符丰富,数据结构丰富C的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型和共用体类型等,能实现各种复杂的数据类型的运算,并引入了指针概念,使程序效率更高.
另外C语言具有强大的图形功能.
(3)C语言是一种结构化程序设计语言,具有结构化语言所要求的三种基本结构这种结构化方式可使程序层次清晰,便于使用、维护和调试.
C语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化.
(4)C语言允许直接访问物理地址C语言能进行位运算,能实现汇编语言的大部分功能,能直接对硬件进行操作.
C语言是高级语言中的低级语言.
(5)C语言预处理机制C语言提供预处理机制,有利于大程序的编写和调试.
(6)C语言可移植性好编写的程序不需要做很多改动就可从一种机型上移到另一种机型上运行.
C语言有一个突出的优点就是适合于多种操作系统,如DOS、UNIX,也适用于多种机型.
(7)C语言语法限制不太严格,程序设计自由度大,对程序员要求不高一般的高级语言语法检查比较严格,能够检查出几乎所有的语法错误.
而C语言允许程序编写者有较大的自由度.
(8)C语言程序生成代码质量高,程序执行效率高一般只比汇编程序生成的目标代码效率低10%~20%.
C语言也存在某些缺点,例如,运算符较多,某些运算符优先顺序与习惯不完全一致,类型转换比较随便等.
1.
3C语言的基本语法成分1.
3.
1字符集字符是可以区分的最小符号,是构成程序的基础.
C语言字符集是ASCII字符集的一个子集,包括英文字母、数字及特殊字符:1)英文字母:a~z和A~Z.
2)数字:0~9.
3)特殊字符:空格.
由字符集中的字符可以构成C语言进一步的语法成分,如标识符、关键字和特殊的运算符等.
1.
3.
2标识符标识符在程序中是用来标识各种程序成分,命名程序中的一些实体,如变量、常量、·5·函数、类型和标号等对象的名字.
C语言规定,合法的标识符必须由英文字母或下划线开头,是字母、数字和下划线的序列,不能跨行书写,自定义的标识符不能与关键字同名.
以下是合法的标识符:x,a1,wang,num_1,radius,1,PI以下是不合法的标识符:a.
1,1sum,x+y,!
abc,123,π,3-c在C语言中,大写字母和小写字母被认为是两个不同的字符,因此标识符SUM与标识符sum是不同的标识符.
习惯上符号常量用大写字母表示,变量名称用小写字母表示.
在标准C中,标识符的长度(即一个标识符允许的字符个数)可以是任意的.
一般的计算机系统规定取前8个字符有效,如果多于8个字符,则多余的字符将不被识别.
如name_of_student和name_of_teacher,就被认为是同一个标识符.
C语言的标识符分为以下三类.
1.
关键字关键字又称为保留字,是C语言中用来表示特殊含义的标识符,由系统提供.
如类型名称int、float,语句特征if、switch、while、for,运算符号sizeof等,是构成C语言的语法基础.
C语言的关键字有32个,它们是:autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhile关键字有特定的语法含义,不允许用户重新定义.
关键字在程序中不允许随意书写,绝对不能拼错.
关键字也不能用作变量名或函数名.
2.
预定义标识符C语言预先定义了一些标识符,它们有特定的含义,通常用作固定的库函数名或预编译处理中的专门命令使用.
如C语言提供的库函数名scanf、printf、sin等,预编译处理命令define,include等.
C语言语法允许用户标识符取名与预定义标识符同名,但这将使这些标识符失去系统规定的原意.
为了避免引起误解,建议用户为标识符取名时不要与系统预先定义的标准标识符(如标准函数)同名.
3.
用户标识符用户标识符是由用户自己定义的标识符,例如定义一个变量名或一个函数名.
用户标识符一般用来给变量、函数、数组或文件等命名,命名时应遵守标识符的命名原则,另外最好做到"见名知义",以提高程序的可读性.
一般选用相应英文单词或拼音的缩写·6·形式,如求和用sum,而尽量不要使用简单代数符号,如x、y、z等.
如果用户标识符与关键字相同,程序在编译时将给出出错信息;如果与预定义标识符相同,系统编译正确,只是该预定义的标识符失去原定含义,代之以用户确认的含义,或者运行时发生错误.
1.
3.
3运算符运算符实际上可以认为是系统定义的函数名字,这些函数作用于运算对象,得到一个运算结果.
运算符通常由1个或多个字符构成.
根据运算对象的个数不同,运算符可分为单目运算符(如:!
、~、++、--和*)、双目运算符(如+、-、*和/)和三目运算符(如:),又称为一元运算符、二元运算符和三元运算符.
C语言运算符非常丰富,详见第2章介绍.
1.
4C语言程序的组成1.
4.
1简单的C程序介绍下面通过介绍几个简单的C程序,来了解C程序的基本结构.
【例1.
1】在计算机屏幕上输出一行文字:"Hello,world!
".
/*该程序在屏幕上输出Hello,world!
*/main(){printf(″Hello,world!
\n″);}程序运行结果:Hello,world!
该程序非常简单,其中main表示"主函数".
每一个C程序都必须有一个main函数,函数体由一对大括号{}括起来,表示函数的开始和结束.
本例中主函数内只有一条输出语句,即标准输出库函数printf(详见第3章).
C语言的每条语句均以分号";"为结束标志.
双引号内的字符串照原样输出.
"\n"是转义字符常量,表示回车换行,即在输出"Hello,world!
"后回车换行,使屏幕上的光标在新行的行首.
程序开始的第1行为注释行,注释行分别以"/*"开头,以"*/"结尾,其间的内容为程序员对程序的注解,可以出现在程序的任何地方,用来说明程序段的功能和变量的作用以及程序员认为应该向程序阅读者说明的任何内容.
在将C程序编译成目标代码时,所有的注解都会被忽略掉.
因此即使使用了很多注解也不会影响目标代码的效率.
恰当的使用注解可以使程序清晰易懂,便于阅读和调试.
在编写每个程序时,应养成撰写注解的良好编程习惯.
但要注意,注释不能嵌套.
【例1.
2】求三个整数之和.
/*求三个整数之和*/#include″stdio.
h″main(){intx,y,z;·7·intsum;printf(″请输入三个整数x,y,z:″);scanf(″%d,%d,%d″,&x,&y,&z);sum=x+y+z;printf(″sum=%d\n″,sum);}输入数据:3,5,8运行结果:sum=16本程序的作用是求三个整数之和sum.
程序的第1行为注释行,说明本程序的作用.
第2行是一条预编译命令,在编译程序之前,凡是以#开头的代码行都要由预处理程序处理.
该行是通知预处理程序把标准输入/输出头文件(stdio.
h)中的内容包含到该程序中.
头文件stdio.
h中包含了编译器在编译标准输出函数printf时要用到的信息和声明,还包含了帮助编译器确定对库函数调用的编写是否正确的信息.
在C语言中,如果仅用到标准输入/输出函数scanf和printf,可以省略该行,C语言默认包含.
但建议每个用到标准输入/输出函数的程序均写上该命令.
关于预编译命令详见第10章.
第4和5行是两条变量说明语句.
在变量说明语句中,int是一个关键字,说明后面的标识符x、y、z和sum是整型变量.
C语言规定,程序中所有使用的变量都必须先定义后使用,关于变量的定义详见第2章.
第6行是一条标准输出语句,在屏幕上显示"请输入三个整数x,y,z:"的提示语.
第7行是一条标准输入语句,scanf是输入函数的名字,该scanf函数的作用是输入三个整数值到变量x、y和z中.
&x中"&"的含义是"取地址",也就是说将三个整数值分别输入到变量x、y和z的地址所标志的单元中,也就是输入给变量x、y、z.
"%d"是输入的"格式字符串",用来指定输入输出时数据类型和格式,"%d"表示"十进制整数类型".
第8行是一条赋值语句,先计算表达式x+y+z的值,然后将计算结果赋给变量sum.
第9行是标准输出语句,其中的函数printf有两个参数,分别为"sum=%d\n"和sum.
第一个参数表示输出格式的控制信息,表示"sum="照原样输出,类似"%d"的输出转换说明的位置用后面相应参数的值按指定的类型和格式依次代替输出.
"\n"是换行符,在屏幕上没有显示,只是使光标移到下一行.
【例1.
3】求三个数的平均值.
/*该程序求三个数的平均值,这是一个自定义函数示例程序*/#include″stdio.
h″/*定义函数average()*/floataverage(floatx,floaty,floatz){floataver;/*定义变量aver类型为单精度实型*/aver=(x+y+z)/3;/*求三个数的平均值*/return(aver);/*返回aver值,通过average带回调用处*/}main()/*主函数*/·8·{floata,b,c,ave;a=6.
5;b=4.
2;c=25.
4;ave=average(a,b,c);/*调用自定义函数average()*/printf("average=%f",ave);/*输出a,b,c的平均值*/}在这个程序中,共定义了两个函数,一个是主函数(main函数),还有一个自定义函数average.
程序的第3行到第8行定义了函数average.
程序的第3行是函数average的头部说明.
因为在average后紧跟一对圆括号,说明average是一个函数名.
在average的前面有一个类型关键字float,说明该函数的返回值的类型为单精度实型.
在average后面的圆括号中是"形参表",说明average函数有三个输入参数x、y和z.
main函数的第4行为调用average函数,在调用时将实际参数a、b和c的值分别一一对应的传给average函数中的形式参数x、y和z.
经过执行average函数得到一个返回值(即三个数的平均值),然后把这个值赋给变量ave,最后输出ave的值.
这里用到了函数调用等概念,读者可能不大理解,等到学习后面的章节时问题自然迎刃而解.
1.
4.
2C语言程序的结构由以上几个例子可以看到,C语言程序的一般组成如下:头文件/*是C系统中特有的文件*/全程变量说明/*用于定义在整个程序中有效的变量*/main()/*主函数说明*/{局部变量说明/*主函数体*/执行语句组}子函数名1(参数)/*子函数说明*/{局部变量说明/*子函数体*/执行语句组}子函数名2(参数)/*子函数说明*/{局部变量说明/*子函数体*/执行语句组}……子函数名n(参数)/*子函数说明*/{局部变量说明/*子函数体*/执行语句组}其中,子函数名1至子函数名n是用户自定义的函数.
由此可见,C语言是一种函数式语言,它的一个函数实际上就是一个功能模块.
一个C程序是由一个固定名称为main的主函数和若干个其他函数(可没有)组成.
·9·注意,一个C程序必须有一个也只能有一个主函数.
主函数在程序中的位置可以任意,但程序执行时总是从主函数开始,并且在主函数内结束.
主函数可以调用其他各种函数(包括用户自己编写的),但其他函数不能调用主函数.
函数是由函数说明和函数体两部分组成.
函数说明部分包含对函数名、函数类型和形式参数等的定义和说明;函数体包括局部变量说明和执行语句组两部分,由一系列语句和注释组成.
整个函数体由一对花括号括起来.
说明部分,用于变量的类型定义,简单程序可以没有此部分,如例1.
1.
所有变量必须先定义(规定数据类型)后使用.
语句由一些基本字符和定义符按照C语言的语法规定组成,每个语句必须用分号";"结束(注意是"每个语句"而不是"每行语句"),编译预处理命令不是语句(行末不能用分号结束).
C语言本身没有输入/输出语句,其输入/输出功能须通过调用标准函数来实现.
使用系统提供的标准库函数或其他文件提供的现成函数时,必须使用"文件包含"(除了printf和scanf语句).
1.
4.
3C程序的书写C程序书写格式自由,但一般应遵循以下原则,可使程序结构清晰,便于阅读.
1.
一行一般写一条语句当然一行可以写多条语句,一条语句也可以分写在多行上.
2.
整个程序采用缩进格式书写表示同一层次的语句行对齐,缩进同样多的字符位置.
如循环体中的语句要缩进对齐,选择体中的语句要缩进对齐.
3.
花括号对齐的书写方式花括号的书写方法较多,本书采用花括号对齐的书写方式,左边花括号处于第一条语句的开始位置,右边花括号独占一行,与左边花括号对齐.
4.
在程序中恰当地使用空行,分隔程序中的语句块,增加程序的可读性本章的最后,给出求圆面积程序,使读者对C语言程序的结构及书写格式有进一步的了解.
【例1.
4】求圆面积程序.
/*求圆面积程序area.
c*/#definePI3.
14159/*编译预处理——宏替换*/#include/*编译预处理——文件包含(标准输入/输出函数)*/#include/*编译预处理——文件包含(数学函数)*/#include/*编译预处理——文件包含(常用函数)*/#include/*编译预处理——文件包含(文本窗口函数)*/·10·main(){floatr,s;clrscr();/*清屏,在conio.
h中定义*/printf(″请输入半径R=″);/*人机对话提示语*/scanf(″%f″,&r);/*将键盘输入值存放在变量r对应的存储单元中*/if(r转义字符时要注意:1)转义字符多用于printf()函数中,而在scanf()函数中通常不使用.
2)转义字符常量,如′\n′,′\x86′等只能代表一个字符.
3)反斜线后的八进制数可以不用0开头.
如′\101′代表字符常量′A′,′\134′代表字符·15·表2.
2转义字符及其含义字符形式含义ASCII码\n回车换行,将当前位置移到下一行开头10\t横向跳到下一制表位置(Tab)9\b退格,将当前位置跳到下一列8\r回车,将当前位置移到当前行开头13\f走纸换页,将当前位置移到下页开头12\\反斜线符″\″92\′单引号符39\"双引号符34\ddd1~3位8进制数所代表的字符1~3位8进制数\xhh1~2位16进制数所代表的字符1~2位16进制数常量′\′.
4)反斜线后的十六进制数只能以小写字母x开头,不允许用大写字母X或0x开头.
【例2.
2】转义字符的使用.
main(){inta,b,c;a=1;b=2;c=3;printf("\t%d\n%d%d\n%d%d\t\b%d\n",a,b,c,a,b,c);}程序的运行结果为:123123在printf函数中,首先遇到第一个"\t",它的作用是让光标到下一个"制表位置",即光标往后移动8个单元,到第9列,然后在第9列输出变量a的值1.
接着遇到"\n",表示回车换行,光标到下行首列的位置,连续输出变量b和c的值2和3.
再遇到"\n",光标到第三行的首列,输出变量a和b的值1和2,再遇到"\t"光标到下一个制表位即第9列.
然后遇到"\b",它的作用是让光标往回退一列,因此光标移到第8列,然后输出变量c的值3.
2.
字符串常量字符串常量是用一对双引号括起来的字符串序列.
例如:"a","china","Iamastudent.
"和"123.
0"等.
C语言规定字符串常量的存储方式为:字符串中的每个字符以其ASCII码值(见附录II)的二进制形式存放在内存中,并且系统自动在该字符串末尾加一个"字符串结束·16·标志"(′\0′,即ASCII码值为0的字符,它不引起任何控制动作,也不是一个可显示的字符),以便系统据此判断字符串是否结束.
例如,字符串"system",实际在内存中是:system\0它占内存不是6个字节,而是7个字节,最后一个字节是′\0′,在输出时并不输出,仅作为处理时的结束标志.
注意,在输入字符串时不必加′\0′,′\0′字符是系统自动加上的.
字符串"a",实际长度为2,包含′a′和′\0′.
如果把它赋给只能容纳一个字符的字符变量c:c="a";显然是错误的.
在C语言中,没有专门的字符串变量.
如果想把一个字符串存放到变量中保存起来,必须使用字符数组,而数组中每一个元素存放一个字符.
2.
3变量所谓变量,就是在程序运行过程中其值可以改变的量,通常是用来保存程序运行过程中的输入数据、计算的中间结果和最终结果.
每个变量一旦被定义,就具备了3个基本的要素:变量名、变量类型和变量值.
2.
3.
1变量名C语言中,变量名是用标识符来表示的.
用来标识变量名、符号常量名、函数名、类型名和文件名等的有效字符序列称为标识符.
C语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线.
下面列出的是合法的标识符,也是合法的变量名:Sum,day,_total,CLASS,name12下面是不合法的变量名和标识符:case,23name,$45,a).
12)下标运算符([]).
13)其他(如函数调用运算符()).
·18·若按其在表达式中与运算对象的关系(连接运算对象的个数)可分为:1)单目运算符(一个运算符连接一个运算对象):取负号)、*、&、sizeof、(类型)2)双目运算符(一个运算符连接两个运算对象):复合赋值运算符3)三目运算符(一个运算符连接三个运算对象)::4)其他()2.
C运算符的优先级和结合性C语言中的运算具有一般数学运算的概念,即具有优先级和结合性(也称为结合方向).
1)优先级:指同一个表达式中不同运算符进行运算时的先后次序.
通常所有单目运算的优先级高于双目运算.
2)结合性:指在表达式中各种运算符优先级相同时,由运算符的结合性确定表达式的运算顺序.
它分为两类:一类运算符的结合性为从左到右,称为左结合性;另一类运算符的结合性是从右到左,称为右结合性.
通常单目、三目和赋值运算符的是右结合性,其余均为左结合性.
关于C语言运算符的种类、优先级和结合性见附录IV.
3.
表达式表达式就是用运算符将操作数连接起来所构成的式子.
操作数可以是常量、变量和函数.
各种运算符能够连接的操作数的个数、数据类型都有各自的规定,要书写正确的表达式就必须遵循这些规定.
例如,下面是一个合法的C表达式:10+′a′+d/e-i*f每个表达式不管多复杂,都有一个值.
这个值就是对操作数依照表达式中运算符规定的运算后计算出来的结果.
求表达式的值是由计算机系统来完成的,但程序设计者必须明白其运算步骤、优先级、结合性和数据类型转换这几方面的问题,否则就得不到正确的结果.
2.
4.
2算术运算符与算术表达式算术运算符用于各类数值运算,包括+和--七种.
表2.
3列出了各种算术运算符的属性.
1.
基本的算术运算符基本的算术运算符包括+、-、*、/和%.
在基本的算术运算符中,单目运算符(+、-)的优先级高于双目(的.
双目运算符的优先级从高到低为:(*、/、%)、·19·(+、-).
其中,*、/、%处于同一级别;+、-处于同一级别,如图2.
2所示.
表2.
3算术运算符运算符号操作数数目名称运算规则适用的数据类型举例+单目正取原值int,float+5-单目负取负值int,float-5+双目加加法int,char,floata+b-双目减减法int,char,floata-b*双目乘乘法int,char,floata*b/双目除除法int,char,floata/b%双目模求余数int,float5%7++单目自增自增1int,floata++--单目自减自减1int,floata--图2.
2算术运算符的优先级【例2.
3】基本算术运算符运算.
2+8/4结果为43.
0+8.
0/-4.
0结果为1.
03+10%5结果为345%4结果为13+10.
5%5.
0结果出错(3+8)/5结果为2从以上例子可以看出,进行基本的算术运算时应该注意的是:1)除法运算的两个操作数如果都是整数,则结果为整数,小数部分一律舍去;如果都是实数,则结果为实数.
2)取余数运算的两个操作数必须是整数,其结果也为整数.
3)圆括号()的优先级最高.
【例2.
4】整数相除的问题.
main(){floatf;f=3/5;printf("%f\n",f);}运行结果为:0.
000000
HostYun 商家以前是玩具主机商,这两年好像发展还挺迅速的,有点在要做点事情的味道。在前面也有多次介绍到HostYun商家新增的多款机房方案,价格相对还是比较便宜的。到目前为止,我们可以看到商家提供的VPS主机包括KVM和XEN架构,数据中心可选日本、韩国、香港和美国的多个地区机房,电信双程CN2 GIA线路,香港和日本机房,均为国内直连线路。近期,HostYun上线低价版美国CN2 GIA ...
美国知名管理型主机公司,2006年运作至今,虚拟主机、VPS、云服务器、独立服务器等业务全部采用“managed”,也就是人工参与度高,很多事情都可以人工帮你处理,不过一直以来价格也贵。也不知道knownhost什么时候开始运作无管理型业务的,估计是为了扩展市场吧,反正是出来较长时间了。闲来无事,那就给大家介绍下“unmanaged VPS”,也就是无管理型VPS,低至5美元/月,基于KVM虚拟,...
RackNerd 商家我们应该是比较熟悉的商家,速度一般,但是人家便宜且可选机房也是比较多的,较多集中在美国机房。包括前面的新年元旦促销的时候有提供年付10美元左右的方案,实际上RackNerd商家的营销策略也是如此,每逢节日都有活动,配置简单变化,价格基本差不多,所以我们网友看到没有必要囤货,有需要就选择。RackNerd 商家这次2022农历新年也是有几款年付套餐。低至RackNerd VPS...
转义字符为你推荐
UNIDOENVIRONMENTALANDSOCIALSAFEGUARDSPOLICIESANDPROCEDURES支持ipad支持ipad支持ipad支持ipadwin10445端口怎么样打开电脑10800端口icloudiphone苹果手机显示"已停用,连接itunes"是什么意思chromeframeicharts 怎么支持ie8googleadsence谷歌adsense是被封了么?routeaddRout add -p在网络中是什么意思?Route add Cp又是什么意思?
美国和欧洲vps sugarhosts 大硬盘 52测评网 40g硬盘 个人域名 秒杀预告 asp免费空间申请 世界测速 稳定免费空间 昆明蜗牛家 申请网页 Updog 监控服务器 国内域名 中国域名 服务器论坛 工信部icp备案查询 ssl加速 江苏双线 更多