Microsoft Word - YYCXfm.DOC

Similar documents
新版 明解C言語入門編

_汪_文前新ok[3.1].doc

Microsoft Word - 《C语言开发入门》课程教学大纲-2.doc

FJXBQ

新・解きながら学ぶC言語

PowerPoint 演示文稿

新・明解C言語入門編『索引』

FY.DOC

没有幻灯片标题

C/C++ - 文件IO

CC213

《C语言程序设计》教材习题参考答案

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

<4D F736F F D205A572D2D A1AAA1AAD4ACE7F42D43D3EFD1D4CAB5D1B5BDCCB3CC2E646F6378>

山东师大数学科学学院

chap07.key

《C语言程序设计》第2版教材习题参考答案

PowerPoint 演示文稿

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

プログラムの設計と実現II

2015年计算机二级(C语言)模拟试题及答案(三)

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

没有幻灯片标题

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3

关于编写硕士研究生入学考试自命题初试科目

nooog

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

Microsoft Word - 正文.doc

高等学校计算机应用规划教材 C 语言程序设计 梁海英张红军主编 千文陈科尹孟伟东曾霖副主编 北 京

内容简介 本书以教育部高等学校计算机科学与技术教学指导委员会编制的 关于进一步加强高等学校计算机基础教学的意见暨计算机基础课程教学基本要求 中有关计算机程序设计基础 (C 语言 ) 课程教学基本要求为指导, 结合教育部考试中心最新的全国计算机等级考试二级 (C 语言程序设计 ) 考试大纲要求和作者多

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

移动平台应用软件开发 C/C++/JAVA 基础 C 中的预处理指令 主讲 : 张齐勋 移动平台应用软件开发 课程建设小组北京大学二零一五年

<4D F736F F F696E74202D20B5DA32D5C220B5A5C6ACBBFA433531D3EFD1D4BBF9B4A1>

Microsoft PowerPoint - 01_Introduction.ppt

C 语言程序设计 ( 第 33 版 )) #define PI // 下面 2 行是函数的原型说明部分 double sup_area(double r); double volume(double r); // 下面是主函数部分 { double a=-5,b,c,d; b=fab

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023)

图书在版编目穴 CIP 雪数据做事细节全书 / 赵彦锋编著郾 北京 : 企业管理出版社, ISBN Ⅰ 郾做... Ⅱ 郾赵... Ⅲ 郾工作方法 通俗读物 Ⅳ 郾 B 中国版本图书馆 CIP 数据核字 (2005) 第 号 书

Microsoft PowerPoint - 03.Fortran程序设计基础1

JAVA 单元 2.1 四则运算机 ( 一 ) 单元教学进度设计 教学环节 教学内容 教师学生活动活动 反馈 反馈课前作业完成情况 反馈加分 1. 下面哪些是合法的变量名? ( ) A.2variable 答案 :DEG B..variable2 解答 : C.._whatavariable A:/

中医疗法(下).doc

第 1 章 C 语言的发展 特点与程序结构 本章主要介绍了 C 语言的发展 特点和程序结构, 重点阐述了程序设计的基本方法, 包括面向过程的程序设计和面向对象的程序设计 ; 算法的概念及其表示, 包括用自然语言 流程图 伪代码 N-S 流程图的表示方法 ; 最后介绍了 C 语言应用程序的开发过程 1

STRUCT Tag OptTag ID Tag ID 7..4 Declarators VarDec ID VarDec LB INT RB FunDec ID LP VarList RP ID LP RP VarList ParamDec COMMA VarList ParamDec Param

Ps22Pdf

test

眼病防治

中国南北特色风味名菜 _八)

图书在版编目 (CIP) 数据程序员的数学. 3, 线性代数 /( 日 ) 平冈和幸, ( 日 ) 堀玄著 ; 卢晓南译. 北京 : 人民邮电出版社, ( 图灵程序设计丛书 ) ISBN Ⅰ. 1 程 Ⅱ. 1 平 2 堀 3 卢 Ⅲ. 1 电子计算

内容简介 C 语言是一种结构化程序设计语言, 本书通过大量的实例讲解 C 语言程序设计的方法, 主要内容包括 C 语言程序的结构 数据类型 运算符和表达式 数据的输入和输出 选择结构 循环结构 数组 函数 指针 编译预处理 结构和共用体 位运算 文件等 每个单元包括小结 实验 习题等 本书可作为高等

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

网C试题(08上).doc

图书在版编目 (CIP) 数据 满堂花醉 / 沈胜衣著. 南京 : 江苏教育出版社, ( 沈郎文字 ) ISBN Ⅰ. 满... Ⅱ. 沈... Ⅲ. 作家 - 人物研究 - 世界 Ⅳ.K815.6 中国版本图书馆 CIP 数据核字 (2005) 第 041

文件

内容简介 本书从结构化程序设计技术出发, 以 C 程序设计语言为载体, 以 Windows 下的 Visual C 为程序调试和运行平台, 通过对典型实例的算法及相应 C 语言代码的描述, 介绍了在程序设计过程中如何对问题进行分析 如何组织数据和如何描述解决问题, 揭示了在计算机应用过

ch02_Basic

PowerPoint 演示文稿

试卷代号 :1253 座位号 E 口 国家开放大学 ( 中央广播电视大学 )2014 年秋季学期 " 开放本科 " 期末考试 C 语言程序设计 A 试题 2015 年 1 月 E 四! 五 总分! 一 单选题 ( 每小题 2 分, 共 20 分 ) 1. 由 C 语言源程序文件编译而成的目标文件的默

《计算概论》课程 第十九讲 C 程序设计语言应用


第7章 数组

心理障碍防治(下).doc

509 (ii) (iii) (iv) (v) 200, , , , C 57

Microsoft Word - MP2018_Report_Chi _12Apr2012_.doc

南華大學數位論文

李天命的思考藝術

皮肤病防治.doc

性病防治

中国南北特色风味名菜 _一)

全唐诗24

林子雨《C语言程序设计》讲义PPT

数据结构

内容简介本书主要内容包括程序设计基础知识 C 语言数据类型 运算符与表达式 程序结构 数组 指针 其他数据类型 函数 文件等, 通过对大量实例进行分析, 力求提高和培养学生的程序设计能力 本书有配套辅导教程 程序设计基础实训指导教程 C 语言 ( 科学出版社出版 ), 引导读者学习和巩固各章节内容

普通高等教育电气信息类应用型规划教材 程序设计基础 基于问题情境的 C 语言实践教程 张克军主 编 代俊雅副主编 北 京

计算概论A B03 C++语言的基本成分 - 运算成分(2)

期中考试试题讲解

运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2

PowerPoint Presentation

任务 3 加法运算练习游戏 019 这就需要用到 C# 语言的基础语法, 如数据类型 运算符和控制语句, 还需要其他的常用控件 在此任务的完成过程中, 读者可以接触到 C# 的数据类型 变量常量 运算符 控制语句等基础语法, 掌握以上知识点及其在软件开发中的应用 3.2 相关知识 预定义


C

图书在版编目 (CIP) 数据 文学与现代性批判 / 邵建著. 南京 : 江苏教育出版社, ISBN Ⅰ. 文... Ⅱ. 邵... Ⅲ. 当代文学 - 文学研究 - 中国 Ⅳ.I206.7 中国版本图书馆 CIP 数据核字 ( 2005 ) 第 04185

实验 2 顺序结构程序设计 9 unsigned short a; a= 1; printf("%d\n",a); 运行以上程序, 查看输出的结果, 分析为什么会输出这些信息 (1) 打开 VC 创建 liti2 2.c 文件 (2) 输入以上代码并编译执行 (3) 结果如图 2 2 所示 图 2

PowerPoint 演示文稿

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx

第 章 顺序结构程序设计 程序里要对数据进行各种操作 其中进行各种运算操作是最基本的操作之一 在 语言程序中 使用表达式 也就是通常所说的计算式子 描述各种运算 表达式是由参与运算的数据和表示运算的符号按照一定的规则组成的式子 描述运算的符号称为运算符 由一个或两个特定符号表示一种运算 语言具有丰富

Mx* Language Reference Manual 2016 年 4 月 7 日 1 用词说明 未定义 指中央还没有表态指语言定义中不涉及的部分, 编译器和运行时环境如何表现是未知的 主要是为了给学生实现语言留下足够的空间, 标准测试集里不会出现涉及未定义部分的内容 例如 : 术语 : 源程

新版 明解C++入門編

Page i

2015年计算机二级(C语言)模拟试题及答案(四)

「香港中學文言文課程的設計與教學」單元設計範本

幻灯片 1

全唐诗28

穨學前教育課程指引.PDF

Microsoft Word - 文前.doc

中医疗法(上).doc

39898.indb

穨ecr2_c.PDF

電腦相關罪行跨部門工作小組-報告書

i

Transcription:

C 语言程序设计 王曙燕主编曹锰副主编 北京

内容简介 本书共 13 章, 主要内容包括 C 语言的基本概念 基本语法和基本数据结构, 另外, 给出了一个小型超市管理的综合实例, 介绍了 C 语言图形程序设计的基本方法, 还简单介绍了 C++ Visual C++ 和 C# 等面向对象程序设计语言 本书注重应用性和实践性, 通过一些典型算法的解题分析及其实现给读者一些解题示范和启发 每章后面配有习题, 附录中有上机实验题目和上机实验指导 本书可作为高等院校各专业 C 语言程序设计课程的教材, 也可供准备参加计算机等级考试和考研的读者阅读参考, 同时也可作为工程技术人员和计算机爱好者的参考资料 图书在版编目 (CIP) 数据 C 语言程序设计 / 王曙燕主编. 北京 : 科学出版社,2005 ( 面向 21 世纪大学计算机基础课程规划教材 ) ISBN 7-03-014884-3 Ⅰ. C Ⅱ. 王 Ⅲ. C 语言 - 程序设计 - 高等学校 - 教材 Ⅳ.TP312 中国版本图书馆 CIP 数据核字 (2005) 第 003325 号责任编辑 : 万国清韩洁 / 责任校对 : 都岚责任印制 : 吕春珉 / 封面设计 : 飞天创意 北京东黄城根北街 16 号 邮政编码 :100717 http://www.sciencep.com 出版 中国科学院印刷厂印刷 科学出版社发行各地新华书店经销 * 2005 年 2 月第一版 开本 :787 1092 1/16 2005 年 2 月第一次印刷 印张 :22 1/4 印数 :1-4 000 字数 :504 00092 1/16 定价 :30.00 元 ( 如有印装质量问题, 我社负责调换 < >) 销售部电话 :010-62136131 编辑部电话 :010-62135120-8001

面向 21 世纪大学计算机基础课程规划教材 编委会 主任 冯博琴 西安交通大学 副主任 崔杜武 西安理工大学 编委 ( 以姓氏笔画为序 ) 王长元王会燃刘天时 张毅坤郝平蒋林 i

前 言 C 语言程序设计是理工科各专业计算机应用能力培养的重要技术基础 C 语言既具有低级语言可直接访问内存地址 能进行位操作 程序运行效率高的优点, 又具有高级语言运算符和数据类型丰富 结构化控制语句功能强 可移植性好的优点, 成为程序设计语言的常青树 通过本课程的学习, 学生可以掌握 C 语言的程序结构 语法规则和编程方法, 达到独立编写常规 C 语言应用程序的能力, 同时为设计大型应用程序和系统程序打下坚实的基础 本课程是数据结构 面向对象程序设计 操作系统和软件工程等课程的基础, 并可为这些课程提供实践工具 本书以程序设计为主线, 全面介绍 C 语言的基本概念 基本语法和基本数据结构 第 1 2 章介绍了 C 语言的特点和 C 语言的基本概念 ; 第 3~5 章讨论了算法的描述和结构化程序设计的基本方法以及三种基本结构 ( 顺序结构 选择结构和循环结构 ); 第 6 章介绍了函数的定义和使用 ; 第 7~9 章介绍了数据的构造类型 ( 包括数组 字符串 结构体和共同体等 ) 和指针类型 ; 第 10 和 11 章介绍了编译预处理和文件的概念, 并给出了一个小型超市管理的综合实例 ; 第 12 章介绍了 C 语言图形程序设计 ; 第 13 章介绍了面向对象程序设计语言 C++ Visual C++ 和 C# 等 C 语言是一门实践性很强的课程, 对学生的编程和调试能力的训练非常重要 在第 3 章 第 5 章和附录 Ⅰ 附录 Ⅵ 附录 Ⅶ 中, 专门介绍了 C 语言的上机步骤和 C 程序的调试技术, 给出了上机实习题目及要求, 并重点介绍了 Turbo C 2.0 集成环境 在第 13 章中也介绍了 C++ 和 Visual C++ 的上机步骤和环境, 便于有能力和兴趣的读者在 Windows 环境下编写 C 程序 本书中的例题均经过 Turbo C 2.0 运行环境的调试 本书讲授时数为 60~70 学时, 其中实验课占 24 学时 学习完本教材后, 应安排两周的 课程设计, 以完成一个小型应用系统的设计与实现 王曙燕任主编, 编写了第 1 3 和 5 章, 曹锰任副主编, 编写了第 7 8 和 9 章, 刘鹏辉编写了第 10 12 章, 王春梅编写了第 4 11 章和附录, 王小银编写了第 2 6 章, 周元哲编写了第 13 章 曹锰 王春梅 王小银和舒新峰老师参与了审校, 最后由王曙燕统稿 陈莉君对教材的编写也提出了很好的建议 作者在此一并向他们表示衷心的感谢 本书可作为大专院校各专业 C 语言程序设计课程的教材, 也可供准备参加计算机等级考试和考研的读者阅读参考, 同时也可作为工程技术人员和计算机爱好者的参考资料 由于编者水平有限, 书中难免存在缺点和错误, 恳请专家和读者批评指正 作者联系方式 :wsyly@sina.com 王曙燕 2004 年 8 月 i

目 录 第 1 章概述 1 1.1 程序设计语言 1 1.1.1 计算机语言 1 1.1.2 程序设计语言的发展 1 1.2 C 程序设计语言 2 1.2.1 C 语言的发展历史 2 1.2.2 C 语言的标准与版本 3 1.2.3 C 语言的特点 3 1.3 C 语言的基本语法成分 4 1.3.1 字符集 4 1.3.2 标识符 4 1.3.3 运算符 6 1.4 C 语言程序的组成 6 1.4.1 简单的 C 程序介绍 6 1.4.2 C 语言程序的结构 8 1.4.3 C 程序的书写 9 习题 1 10 第 2 章基本数据类型 运算符及表达式 11 2.1 C 的基本数据类型 11 2.1.1 数据类型 11 2.1.2 C 语言数据类型简介 11 2.1.3 C 的基本数据类型 12 2.2 常量 13 2.2.1 整型常量 13 2.2.2 实型常量 13 2.2.3 符号常量 14 2.2.4 字符型常量 14 2.3 变量 16 2.3.1 变量名 16 2.3.2 变量类型 16 2.3.3 变量值 17 2.4 运算符及表达式 17 2.4.1 C 运算符简介 17 2.4.2 算术运算符与算术表达式 18 iii

2.4.3 赋值运算符与赋值表达式 21 2.4.4 逗号运算符和逗号表达式 23 2.4.5 不同类型数据间的混合运算与类型转换 24 习题 2 25 第 3 章算法和基本程序设计 27 3.1 算法 27 3.1.1 算法的概念 27 3.1.2 算法的评价标准 28 3.1.3 算法的表示 29 3.2 结构化程序设计的方法 31 3.3 程序的基本结构 31 3.3.1 顺序结构 32 3.3.2 选择结构 32 3.3.3 循环结构 33 3.4 顺序结构程序设计 34 3.5 数据的输入与输出 35 3.5.1 C 语言中数据的输入与输出 35 3.5.2 字符数据的输入与输出 36 3.5.3 格式输入与输出 38 3.6 C 程序的上机步骤 44 3.6.1 C 程序的上机步骤 44 3.6.2 Turbo C 2.0 简介 45 习题 3 47 第 4 章选择分支结构程序设计 48 4.1 关系运算 48 4.1.1 关系运算符 48 4.1.2 关系表达式 48 4.2 逻辑运算 49 4.2.1 逻辑运算符 49 4.2.2 逻辑表达式 50 4.3 二路分支 if 语句 51 4.3.1 if 语句的一般形式 51 4.3.2 if 语句的嵌套 56 4.4 条件运算符与表达式 58 4.5 多路分支 switch 语句 58 4.5.1 switch 语句的一般形式 58 4.5.2 switch 语句的嵌套 60 4.6 选择分支结构程序举例 60 习题 4 64 iv

第 5 章循环结构程序设计 66 5.1 while 语句 66 5.2 do-while 语句 68 5.3 for 语句 70 5.4 goto 语句 73 5.5 循环的嵌套 74 5.6 break 和 continue 语句 76 5.6.1 continue 语句 76 5.6.2 break 语句 77 5.7 循环结构程序举例 79 5.8 C 程序的基本调试技术 82 习题 5 83 第 6 章函数 85 6.1 概述 85 6.1.1 C 程序基本结构 85 6.1.2 函数分类 85 6.2 函数的定义 86 6.3 函数的参数和函数的返回值 88 6.3.1 形式参数和实际参数 88 6.3.2 函数的返回值 89 6.4 函数的调用 90 6.4.1 函数调用的一般形式 90 6.4.2 函数调用的方式 91 6.5 函数声明和函数原型 92 6.6 函数的嵌套调用 93 6.7 函数的递归调用 95 6.8 变量的作用域 98 6.8.1 局部变量 98 6.8.2 全局变量 99 6.9 变量的存储类型 101 6.9.1 静态存储方式和动态存储方式 101 6.9.2 静态局部变量 101 6.9.3 自动变量 102 6.9.4 寄存器变量 103 6.9.5 静态全局变量和非静态全局变量 104 6.9.6 存储类型小结 105 6.10 内部函数和外部函数 106 6.10.1 内部函数 106 6.10.2 外部函数 106 v

6.11 多文件程序的运行 107 习题 6 108 第 7 章数组 112 7.1 一维数组 112 7.1.1 一维数组的定义和初始化 112 7.1.2 一维数组元素的引用 113 7.1.3 一维数组应用举例 114 7.2 二维数组 117 7.2.1 二维数组的定义和初始化 117 7.2.2 二维数组元素的引用 118 7.2.3 二维数组应用举例 119 7.3 字符数组 125 7.3.1 字符数组的定义和引用 125 7.3.2 字符数组的输入输出 126 7.3.3 字符串处理函数 128 7.3.4 字符数组应用举例 131 7.3.5 容易出的错误 133 习题 7 134 第 8 章结构体与共用体 137 8.1 结构体类型定义 137 8.2 结构体变量 138 8.2.1 结构体变量的定义与初始化 138 8.2.2 结构体变量的引用 140 8.3 结构体数组 142 8.3.1 结构体数组的定义与初始化 142 8.3.2 结构体数组元素的引用 143 8.4 结构体和函数 145 8.4.1 结构体作函数参数 145 8.4.2 返回值为结构体类型的函数 146 8.5 共用体 147 8.5.1 共用体类型定义 147 8.5.2 共用体变量定义与引用 148 8.5.3 共用体应用举例 150 8.6 枚举类型 152 8.7 typedef 语句 154 习题 8 155 第 9 章指针 157 9.1 地址和指针的概念 157 9.1.1 变量的地址 157 vi

9.1.2 直接访问和间接访问 158 9.1.3 指针的概念 158 9.2 指针变量 159 9.2.1 指针变量的定义 159 9.2.2 指针变量的引用 160 9.2.3 实现引用传递 162 9.3 指针与数组 165 9.3.1 指向数组元素的指针 165 9.3.2 指针数组 173 9.3.3 多维数组和指向分数组的指针 176 9.4 结构体与指针 181 9.4.1 指向结构体的指针变量 181 9.4.2 用指向结构体的指针作函数参数 182 9.5 指针与函数 183 9.5.1 返回值为指针类型的函数 183 9.5.2 指向函数的指针和函数参数 184 9.6 指针与链表 187 9.6.1 存储空间的分配和释放 187 9.6.2 动态数据结构 链表 188 习题 9 195 第 10 章编译预处理及位运算 198 10.1 文件包含处理 #include 198 10.2 宏定义 #define 200 10.2.1 不带参数的宏定义 200 10.2.2 带参数的宏定义 201 10.3 条件编译 203 10.4 位运算符和位运算 204 10.5 位段 206 10.6 位运算举例 208 习题 10 209 第 11 章文件 213 11.1 文件的概述 213 11.1.1 文件的概念及分类 213 11.1.2 文件的操作流程 214 11.1.3 文件缓冲区 215 11.2 文件类型的指针 215 11.3 文件的打开与关闭 216 11.3.1 打开文件 fopen 函数 216 11.3.2 文件关闭函数 fclose 218 vii

11.4 文件的顺序读写 218 11.4.1 字符读写函数 fgetc 和 fputc 219 11.4.2 字符串读写函数 fgets 和 fputs 222 11.4.3 格式化读写函数 fscanf 和 fprintf 224 11.4.4 数据块读写函数 fread 和 fwrite 225 11.5 文件的随机读写 228 11.5.1 rewind 函数 228 11.5.2 fseek 函数 229 11.5.3 ftell 函数 230 11.6 其他读写函数 230 11.7 出错的检测 231 11.7.1 feof 函数 231 11.7.2 ferror 函数 232 11.7.3 clearerr 函数 232 11.8 程序举例 233 习题 11 245 第 12 章 C 语言图形程序设计 246 12.1 概述 246 12.2 图形模式的初始化和检测函数 246 12.3 基本绘画 249 12.3.1 画点函数和定位函数 249 12.3.2 画线函数和设定线型函数 250 12.3.3 画圆和椭圆函数 252 12.4 图形填充 253 12.4.1 设定填充方式函数 253 12.4.2 图形填充函数 254 12.5 图形模式下的文本输出 255 12.5.1 文本字符的输出函数 256 12.5.2 字体格式和输出方式的设置 256 12.6 视口和视口函数 258 12.7 屏幕操作 260 12.7.1 屏幕颜色的设置 260 12.7.2 cleardevice() 清屏函数 261 12.7.3 激活页函数 261 12.7.4 图像处理函数 262 12.7.5 键盘对屏幕的控制操作 264 习题 12 265 第 13 章面向对象程序设计简介 269 13.1 面向对象程序设计 269 viii

13.1.1 面向对象程序设计的产生背景 269 13.1.2 面向对象程序设计的基本术语 270 13.1.3 面向对象的软件开发过程 273 13.2 Windows 编程基础知识 276 13.2.1 事件驱动的概念 277 13.2.2 句柄 278 13.2.3 Windows 下的消息机制 278 13.2.4 Windows 应用程序的基本组成 281 13.3 C++ 281 13.3.1 C++ 的起源与发展 281 13.3.2 C++ 语言的特点 281 13.3.3 I/O 流 注释和书写格式 282 13.3.4 编写与运行你的第一个 C++ 程序 Hello World.cpp 283 13.4 Visual C++ 284 13.4.1 MFC 概述 284 13.4.2 MFC 消息映射的工作方式 285 13.4.3 用 AppWizard 生成程序框架 286 13.4.4 一个完整的 Windows 应用程序 289 13.4.5 如何获取帮助 293 13.5 C# 294 13.5.1 Microsoft.Net 简介 294 13.5.2 C# 的特点 296 13.5.3 C# 的编译流程 296 13.5.4 一个简单 C# 程序 297 习题 13 300 附录 301 附录 I 上机实验 301 附录 II 常用字符与 ASCII 码对照表 309 附录 Ⅲ C 语言中的关键字表 312 附录 IV C 语言中的运算符的优先级与结合性一览表 312 附录 V C 库函数 313 附录 VI Turbo C 2.0 菜单介绍 321 附录 VII Turbo C 2.0 编译错误信息介绍 333 主要参考文献 339 ix

第 1 章概 述 计算机技术正在日新月异地迅猛发展, 广泛应用于社会生活的各个领域, 成为大众化的现代工具 人们用计算机解决问题时, 必须用某种 语言 来和计算机进行交流 具体地说, 就是利用某种计算机语言提供的命令来编制程序, 并把程序存储在计算机的存储器中, 然后利用这个程序来控制计算机的运行, 以达到解决问题的目的 这种用于编写计算机可执行程序的语言称为程序设计语言 目前已发明的计算机程序设计语言有上千种, 无论什么样的计算机语言, 其程序设计的基本方法都是相同的 本书将以国际上广泛流行的 C 程序设计语言为例, 介绍程序设计的基本概念和基本方法 1.1 程序设计语言 1.1.1 计算机语言计算机语言是人们描述计算过程 ( 即程序 ) 的规范书写语言 程序是对计算机处理对象和计算规则的描述 语言的基础是一组记号和语法规则 根据语法规则由记号构成记号串的全体就是语言 人类是使用像英语 汉语这样的自然语言相互交流和表达思想的 人与计算机如何 交流 呢? 人和计算机交流也要用人和计算机都容易接受和理解的语言, 这就是计算机语言 计算机语言是根据计算机的特点而编制的, 是计算机能够 理解 的语言, 它是有限规则的集合 计算机语言不像自然语言那样包含复杂的语义和语境, 而是用语法来表达程序员的思想, 所以编写程序时必须严格遵守语法规则 1.1.2 程序设计语言的发展计算机是一种具有内部存储能力 由程序自动控制的电子设备 人们将需要计算机做的工作写成一定形式的指令, 并把它们存储在计算机的内部存储器中 当人们需要结果时就向计算机发出一条简单的命令, 计算机就按指令操作顺序自动进行 人们把这种可以连续执行的一条条指令的集合称为程序 也就是说, 程序是计算机指令的序列, 编制程序的工作就是为计算机安排指令序列 程序设计语言伴随着计算机技术的发展层出不穷, 从机器语言到高级语言, 从面向过程的语言到面向对象的语言 至目前为止, 计算机语言的发展大致经历了五代 第一代也称机器语言, 它将计算机指令中的操作码和操作数均以二进制代码表示, 是计算机能直接识别和执行的语言 它在形式上是由 0 和 1 构成的一串二进制代码, 每种计算机都有自己的一套机器指令 机器语言的优点是无需翻译, 占用内存少 执行速度快 缺点是随机而异, 通用性差, 并且因指令和数据都是二进制代码形式, 难于阅读和记忆, 编码工作量大, 难以维护 1

第二代语言也叫汇编语言, 是用助记符号来表示机器指令的符号语言 如用 ADD 表示加法, 用 SUB 表示减法, 用变量取代各类地址, 这样构成的计算机符号语言称为汇编语言 用汇编语言编写的程序称为汇编语言源程序 这种程序必须经过翻译 ( 称为汇编 ), 变成机器语言程序才能被计算机识别和执行 汇编语言在一定程度上克服了机器语言难于辨认和记忆的缺点, 但对于大多数用户来说, 仍然不便于理解和使用 第三代语言即高级语言, 也称为面向过程的语言 高级语言是具有国际标准的, 描述形式接近自然语言的计算机语言 它采用了完全符号化的描述形式, 用类似自然语言的形式描述对问题的处理过程, 用数学表达式的形式描述对数据的计算过程 常用的计算机高级语言有 Basic Fortran Cobol Pascal 和 C 语言等 由于高级语言只是要求人们向计算机描述问题的求解过程, 而不关心计算机的内部结构, 所以把高级语言称为面向过程的语言 使用面向过程的语言编程时, 编程者的主要精力放在算法过程的设计和描述上 第四代语言又叫非过程化语言, 是一种功能更强的高级语言 主要特点是 : 非过程性 采用图形窗口和人机对话形式 基于数据库和 面向对象 技术 易编程 易理解 易使用 易维护 但是, 程序的运行效率和语言的灵活性不如过程化语言高 常用的非过程化语言有 Visual Basic Java Visual C++ 和 Delphi 等 如果说第三代语言要求人们告诉计算机 怎么做, 那么第四代语言只要求人们告诉计算机 做什么 第五代语言也称智能化语言, 主要使用在人工智能领域, 帮助人们编写推理 演绎程序 目前, 国内外大多数计算机上运行的程序, 大多是用第三代或第四代计算机语言编写的 因此, 应当熟练地掌握用高级语言编写程序的方法和技巧 由于面向过程的语言是程序设计的基础, 所以, 本书将以面向过程的 C 语言为背景, 介绍程序设计的基本概念和基本方法 在本书最后一章, 将简单介绍面向对象程序设计的基本方法及流行的面向对象程序设计语言 C++ Visual C++ 和 C# 1.2 C 程序设计语言 1.2.1 C 语言的发展历史 C 语言是国际上流行的, 使用最广泛的高级程序设计语言 它既可用来写系统软件, 也可用来写应用软件 C 语言具有语言简洁紧凑, 使用方便灵活及运算符丰富等特点 它具有现代化语言的各种数据结构, 有结构化的控制语句, 并且语法限制不太严格, 程序设计自由度大, 能实现汇编语言的大部分功能 另外,C 语言生成目标代码质量高, 不仅程序执行效率高, 而且程序可移植性好 C 语言的产生基于两个方面的需要 一是为满足 UNIX 操作系统开发的需要 UNIX 操作系统是一个通用的 复杂的计算机管理系统 ; 二是为拉近高级语言与硬件之间距离的需要 C 语言集高级语言与汇编语言优点于一身 C 语言面对实际应用的需要而产生, 直至今日仍不改初衷 C 语言是从 BCPL(basic combined programming language) 语言和 2

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.2 C 语言的标准与版本随着 C 语言的普及, 各机构分别推出了自己的 C 语言版本 某些执行过程的微小差别不时引起 C 程序之间的不兼容, 给程序的移植带来很大的困难 美国国家标准协会 (ANSI) 从 1983 年开始, 经过长达 5 年的努力, 制定了 C 语言的新标准 ANSI C 现在提及 C 语言的标准就是指该新标准 ANSI C 比原标准 C 有很大的发展, 解决了经典定义中的二义性, 给出了 C 语言的新特点 任何 C 程序都必须遵循 ANSI C 标准, 本教材也以 ANSI C 作为基础 尽管这样, 各种版本的 C 编译系统还是略有差异, 因此, 读者在使用具体的 C 语言编译系统时, 还应参考相关的手册以了解具体的规定 C 语言有多种版本 :TC 2.0,BC 3.1,BC 5.0 和 VC 6.0 等, 最新的是为 Windows 和 Web 应用程序提供动态开发环境的 Visual C++.NET(C#) 1.2.3 C 语言的特点 C 语言的主要特点有 : (1)C 语言简洁 紧凑, 编写的程序短小精悍 C 编译程序的代码量较小, 便于在微型机上应用 3

(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.3 C 语言的基本语法成分 1.3.1 字符集字符是可以区分的最小符号, 是构成程序的基础 C 语言字符集是 ASCI I 字符集的一个子集, 包括英文字母 数字及特殊字符 : 1) 英文字母 :a~z 和 A~Z 2) 数字 :0~9 3) 特殊字符 : 空格!# % ^ & * - - + = ~ < > /\., : ;? ( ) [ ] { } 由字符集中的字符可以构成 C 语言进一步的语法成分, 如标识符 关键字和特殊的运算符等 1.3.2 标识符标识符在程序中是用来标识各种程序成分, 命名程序中的一些实体, 如变量 常量 4

函数 类型和标号等对象的名字 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 个, 它们是 : auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while 关键字有特定的语法含义, 不允许用户重新定义 关键字在程序中不允许随意书写, 绝对不能拼错 关键字也不能用作变量名或函数名 2. 预定义标识符 C 语言预先定义了一些标识符, 它们有特定的含义, 通常用作固定的库函数名或预编译处理中的专门命令使用 如 C 语言提供的库函数名 scanf printf sin 等, 预编译处理命令 define,include 等 C 语言语法允许用户标识符取名与预定义标识符同名, 但这将使这些标识符失去系统规定的原意 为了避免引起误解, 建议用户为标识符取名时不要与系统预先定义的标准标识符 ( 如标准函数 ) 同名 3. 用户标识符用户标识符是由用户自己定义的标识符, 例如定义一个变量名或一个函数名 用户标识符一般用来给变量 函数 数组或文件等命名, 命名时应遵守标识符的命名原则, 另外最好做到 见名知义, 以提高程序的可读性 一般选用相应英文单词或拼音的缩写 5

形式, 如求和用 sum, 而尽量不要使用简单代数符号, 如 x y z 等 如果用户标识符与关键字相同, 程序在编译时将给出出错信息 ; 如果与预定义标识符相同, 系统编译正确, 只是该预定义的标识符失去原定含义, 代之以用户确认的含义, 或者运行时发生错误 1.3.3 运算符运算符实际上可以认为是系统定义的函数名字, 这些函数作用于运算对象, 得到一个运算结果 运算符通常由 1 个或多个字符构成 根据运算对象的个数不同, 运算符可分为单目运算符 ( 如 :! ~ ++ -- 和 *) 双目运算符 ( 如 + - * 和 /) 和三目运算符 ( 如?:), 又称为一元运算符 二元运算符和三元运算符 C 语言运算符非常丰富, 详见第 2 章介绍 1.4 C 语言程序的组成 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() { int x, y, z; 6

int sum; 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()*/ float average ( float x, float y, float z) { float aver; /* 定义变量 aver 类型为单精度实型 */ aver=(x+y+z)/3; /* 求三个数的平均值 */ return(aver); /* 返回 aver 值, 通过 average 带回调用处 */ } main() /* 主函数 */ 7

{ float a,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.2 C 语言程序的结构 由以上几个例子可以看到,C 语言程序的一般组成如下 : 头文件 /* 是 C 系统中特有的文件 */ 全程变量说明 /* 用于定义在整个程序中有效的变量 */ main() /* 主函数说明 */ { 局部变量说明 /* 主函数体 */ 执行语句组 } 子函数名 1( 参数 ) /* 子函数说明 */ { 局部变量说明 /* 子函数体 */ 执行语句组 } 子函数名 2( 参数 ) /* 子函数说明 */ { 局部变量说明 /* 子函数体 */ 执行语句组 } 子函数名 n( 参数 ) /* 子函数说明 */ { 局部变量说明 /* 子函数体 */ 执行语句组 } 其中, 子函数名 1 至子函数名 n 是用户自定义的函数 由此可见,C 语言是一种函数式语言, 它的一个函数实际上就是一个功能模块 一个 C 程序是由一个固定名称为 main 的主函数和若干个其他函数 ( 可没有 ) 组成 8

注意, 一个 C 程序必须有一个也只能有一个主函数 主函数在程序中的位置可以任意, 但程序执行时总是从主函数开始, 并且在主函数内结束 主函数可以调用其他各种函数 ( 包括用户自己编写的 ), 但其他函数不能调用主函数 函数是由函数说明和函数体两部分组成 函数说明部分包含对函数名 函数类型和形式参数等的定义和说明 ; 函数体包括局部变量说明和执行语句组两部分, 由一系列语句和注释组成 整个函数体由一对花括号括起来 说明部分, 用于变量的类型定义, 简单程序可以没有此部分, 如例 1.1 所有变量必须先定义 ( 规定数据类型 ) 后使用 语句由一些基本字符和定义符按照 C 语言的语法规定组成, 每个语句必须用分号 ; 结束 ( 注意是 每个语句 而不是 每行语句 ), 编译预处理命令不是语句 ( 行末不能用分号结束 ) C 语言本身没有输入 / 输出语句, 其输入 / 输出功能须通过调用标准函数来实现 使用系统提供的标准库函数或其他文件提供的现成函数时, 必须使用 文件包含 ( 除了 printf 和 scanf 语句 ) 1.4.3 C 程序的书写 C 程序书写格式自由, 但一般应遵循以下原则, 可使程序结构清晰, 便于阅读 1. 一行一般写一条语句当然一行可以写多条语句, 一条语句也可以分写在多行上 2. 整个程序采用缩进格式书写表示同一层次的语句行对齐, 缩进同样多的字符位置 如循环体中的语句要缩进对齐, 选择体中的语句要缩进对齐 3. 花括号对齐的书写方式花括号的书写方法较多, 本书采用花括号对齐的书写方式, 左边花括号处于第一条语句的开始位置, 右边花括号独占一行, 与左边花括号对齐 4. 在程序中恰当地使用空行, 分隔程序中的语句块, 增加程序的可读性本章的最后, 给出求圆面积程序, 使读者对 C 语言程序的结构及书写格式有进一步的了解 例 1.4 求圆面积程序 /* 求圆面积程序 area.c */ #define PI 3.14159 /* 编译预处理 宏替换 */ #include <stdio.h> /* 编译预处理 文件包含 ( 标准输入 / 输出函数 ) */ #include <math.h> /* 编译预处理 文件包含 ( 数学函数 ) */ #include <stdlib.h> /* 编译预处理 文件包含 ( 常用函数 ) */ #include <conio.h> /* 编译预处理 文件包含 ( 文本窗口函数 ) */ 9

main() { float r,s; clrscr(); /* 清屏, 在 conio.h 中定义 */ printf( 请输入半径 R= ); /* 人机对话提示语 */ scanf( %f,& r); /* 将键盘输入值存放在变量 r 对应的存储单元中 */ if (r<0) /* 如果输入的半径值为负值 */ { printf ( 输入出错, 半径不能为负值!"); /* 显示出错提示 */ exit(0); /* 停止程序执行, 返回操作系统 */ } s=pi*pow(r,2); printf( 半径 R=%.3f 时, 面积 S=%.3f\n, r, s); /* 限制 R,S 小数位数 */ } 习题 1 1.1 计算机语言的发展经历了哪几个阶段? 1.2 C 语言的主要特点是什么? 1.3 C 语言程序由哪几部分组成? 1.4 C 语言的标识符是怎样组成的? 1.5 编写一个 C 语言程序, 要求输出以下信息 : *************** How are you! *************** 1.6 编写一个 C 语言程序, 从键盘输入 x y z 三个变量, 并输出其中的最小值 10

第 2 章基本数据类型 运算符及表达式 程序处理的对象是数据, 编写程序也就是对数据的处理过程, 而运算符是对数据进行处理的具体描述 在学习用 C 语言编程之前, 必须掌握一些关于数据和运算符的基础知识 2.1 C 的基本数据类型 2.1.1 数据类型数据是计算机程序加工处理的对象 抽象地说, 数据是对客观事物所进行的描述, 而这种描述是采用了计算机能够识别 存储和处理的形式来进行的 程序所能够处理的基本数据对象被划分成一些组或一些集合 属于同一集合的各数据对象都具有同样的性质, 例如对它们能做同样的操作, 它们都采用同样的编码方式等 把程序中具有这样性质的集合, 称为数据类型 在程序设计的过程中, 计算机硬件也把被处理的数据分成一些类型 CPU 对不同的数据类型提供了不同的操作指令, 程序设计语言中把数据划分成不同类型也与此有密切关系 在程序设计语言中, 都是采用数据类型来描述程序中的数据结构 数据表示范围和数据在内存中的存储分配等 可以说数据类型是计算机领域中一个非常重要的概念 2.1.2 C 语言数据类型简介在程序中对所有的数据都要先指定其数据结构然后才可以使用 数据结构是数据的组织形式 C 语言的数据结构是以数据类型的形式出现的 C 语言的数据类型有基本类型 构造类型 指针类型和空类型等, 如图 2.1 所示 整型 基本类型实型 ( 浮点型 ) 字符型 单精度型 双精度型 C 语言数据类型 构造类型 指针类型 数组类型结构体类型共用体类型枚举类型 空类型 图 2.1 C 语言数据类型 11

1. 基本类型基本类型是其他数据类型的基础, 由它可以构造出其他复杂的数据类型 基本数据类型的值不可以再分解为其他类型 2. 构造类型构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的 一个构造类型的值可以分解成若干个 成员 或 元素 每个 成员 或 元素 都是一个基本数据类型或又是一个构造类型 在 C 语言中, 构造类型有数组 结构体和共用体三种 3. 指针类型指针是 C 语言中一种特殊的又具有重要作用的数据类型, 其值表示某个量在内存中的地址 虽然指针变量的取值类似于整型量, 但这两个类型是完全不同的量 : 一个是变量的数值, 一个是变量在内存中存放的地址 4. 空类型在 C 语言中允许定义空类型的数据, 并用 void 类型说明符进行声明 2.1.3 C 的基本数据类型 C 语言的数据类型有多种多样, 而基本的数据类型是其他各种数据类型的基础 因此, 本节主要介绍基本数据类型, 其他数据类型将在后续章节中逐步介绍 C 语言的基本数据类型包括 : 整型 单精度型 双精度型和字符型四种, 其声明的关键字分别为 int( 整型 ),float( 单精度型 ) double( 双精度型 ) 和 char( 字符型 ) 除了这四种基本数据类型关键字外, 还有一些数据类型修饰符, 用来扩充其基本类型的意义, 以便准确地适应各种情况的需要 修饰符有 :long( 长型 ) short( 短型 ) signed( 有符号 ) 和 unsigned( 无符号 ) 这些修饰符与基本数据类型的关键字组合, 可以表示不同的数值范围以及数据所占内存空间的大小 表 2.1 给出了基本数据类型和基本类型加上修饰符组合之后, 各数据类型所占内存空间字节数和所表示的数值范围 ( 以 16 位计算机为例, 即按标准 ANSI C 描述 ) 表 2.1 基本数据类型描述 类型 字节 说明 数值范围 [signed] int 2 整型 -32768~32767 即 -2 15 ~( 2 15-1) unsigned [int] 2 无符号整型 0~65535 即 0~( 2 16-1) [signed] short [int] 2 短整型 -32768~32767 即 -2 15 ~( 2 15-1) Unsigned short [int] 2 无符号短整型 0~65535 即 0~( 2 16-1) long [int] 4 长整型 -2147483648~2147483647 即 -2 31 ~( 2 31-1) unsigned long [int] 4 无符号长整型 0~4294967295 即 0~( 2 32-1) 12

续表 类型 字节 说明 数值范围 float 4 单精度型 -3.4 10 38 ~3.4 10 38 7 位有效位 double 8 双精度型 -1.7 10 308 ~1.7 10 308 15 位有效位 long double 16 长双精度型 -3.4 10 4932 ~3.4 10 4932 19 位有效位 signed char 1 有无符号字符型 -128~127 即 -2 7 ~( 2 7-1) [unsigned] char 1 无无符号字符型 0~256 即 0~( 2 8-1) 2.2 常量 在程序运行过程中, 其值不能改变的量称为常量 在基本数据类型中, 常量可分为 : 整型常量 实型常量 符号常量和字符型常量 ( 包括字符常量和字符串常量两种 ), 现分别介绍如下 2.2.1 整型常量整型常量即为整常数,C 语言中整常数可用十进制 八进制和十六进制 3 种形式表示 1) 十进制整数 由 0 至 9 的数字组成, 如 -123,0,10, 但不能以 0 开始 2) 八进制整数 以 0 为前缀, 其后由 0 至 7 的数字组成, 如 0456 表示八进制数 456, 即 (456) 8, 其值为 :4 8 2 +5 8 1 +6 8 0, 等于十进制数 302;- 011 表示八进制数 -11, 即十进制数 -9 3) 十六进制整数 以 0x 或 0X 开头, 其后由 0 至 9 的数字和 A 至 F 字母组成, 如 0x7A 表示十六进制数 7A, 即 (7A) 16 =7 16 1 +A 16 0 =122;- 0x12 等于十进制数 -18 2.2.2 实型常量 C 语言中, 实数又称浮点数, 一般有两种表示形式 : 1) 十进制小数形式 由数字和小数点组成 ( 必须有小数点 ), 如 1.2.24 2. 0.0 等 2) 指数形式 比如,123.4e3 和 123.4E3 均表示 123.4 10 3 用指数形式表示实型常量时要注意,e 和 E 前面必须有数字, 后面必须是整数 15e2.3 e3 和.e3 都是错误的指数形式 一个实数可以有多种指数表示形式, 例如 123.456 可以表示为 123.456e0 12.3456e1 1.23456e2 0.123456e3 和 0.0123456e4 等多种形式 把其中 1.23456e2 称为规范化的指数形式, 即在字母 e 或 E 之前的小数部分中, 小数点左边的部分应有且只有一位非零的数字 一个实数在用指数形式输出时, 是按规范化的指数形式输出的 13

2.2.3 符号常量 用一个标识符表示一个常量的, 称为符号常量, 即标识形式的常量 例如, 用 PI 代表圆周率 π, 即 3.1415926 例 2.1 符号常量的使用 #define PI 3.14 main() { int r=2; float s,l; l=2*pi*r; s = PI*r*r; printf( l=%f,s=%f\n,l,s); } 程序中用 #define 命令行定义 PI 代表常量, 对此程序进行编译时, 预处理首先将出现 PI 的地方用 3.14 字符串替换 定义符号常量的目的是提高程序的可读性, 便于程序调试 修改和纠错 当某个常量值在程序中被多次使用时, 可用符号常量来代替常量值 例如上面的程序, 为了提高精度, 需取圆周率的值为 3.1415926 若使用符号常量, 则只需要修改 define 中的常量值, 程序中的其他部分都不需要改变, 否则就要到程序体中, 将圆周率的值逐一改变 因此定义符号常量可以做到需要改变一个常量时能做到 一改全改 在使用符号常量时要注意, 虽然它是用标识符来标识的, 但它本质上是常量, 具有常量值不能改变的性质 例如, 假设在一个程序中有如下两个定义 : #define PI 3.14 #define PI 3.1415926 则是错误的, 因为在一个程序中不能对同一个符号常量定义两次 习惯上, 为了与程序中的变量名相区别, 符号常量名一般用大写字母表示 2.2.4 字符型常量 字符型常量包括字符常量和字符串常量两类 1. 字符常量 字符常量又称为字符常数,C 语言中的字符常量是用单引号括起来的一个字符 例如 : a, A, x, 3 和 # 等都是字符常量值 注意其中 a 和 A 是不同的字符常量 除了以上形式的字符常量外, 对于常用的但却难以用一般形式表示的不可显示字符,C 语言提供了一种特殊形式的字符常量, 即用一个转义标识符 \ ( 反斜线 ) 开头的字符序列, 如表 2.2 所示 使用转义字符时要注意 : 1) 转义字符多用于 printf() 函数中, 而在 scanf() 函数中通常不使用 2) 转义字符常量, 如 \n, \x86 等只能代表一个字符 3) 反斜线后的八进制数可以不用 0 开头 如 \101 代表字符常量 A, \134 代表字符 14

表 2.2 转义字符及其含义 字符形式 含义 ASCII 码 \n 回车换行, 将当前位置移到下一行开头 10 \t 横向跳到下一制表位置 (Tab) 9 \b 退格, 将当前位置跳到下一列 8 \r 回车, 将当前位置移到当前行开头 13 \f 走纸换页, 将当前位置移到下页开头 12 \\ 反斜线符 \ 92 \ 单引号符 39 \ 双引号符 34 \ddd 1~3 位 8 进制数所代表的字符 1~3 位 8 进制数 \xhh 1~2 位 16 进制数所代表的字符 1~2 位 16 进制数 常量 \ 4) 反斜线后的十六进制数只能以小写字母 x 开头, 不允许用大写字母 X 或 0x 开头 例 2.2 转义字符的使用 main() { int a,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); } 程序的运行结果为 : 23 1 12 3 在 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, I am a student. 和 123.0 等 C 语言规定字符串常量的存储方式为 : 字符串中的每个字符以其 ASCII 码值 ( 见附录 II) 的二进制形式存放在内存中, 并且系统自动在该字符串末尾加一个 字符串结束 15

标志 ( \0, 即 ASCII 码值为 0 的字符, 它不引起任何控制动作, 也不是一个可显示的字符 ), 以便系统据此判断字符串是否结束 例如, 字符串 system, 实际在内存中是 : s y s t e m \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<b,ab# 注意 :C 语言中大写和小写字母被认为是两个不同的字符, 例如,Sum 和 sum 是两个不同的变量名 变量名一般用小写字母表示, 命名时应尽量做到 见名知义, 可以增加可读性, 同时 C 系统中规定的关键字 ( 见附录 III), 不能作为变量名使用 为了程序的可移植性以及阅读程序的方便性, 建议变量名的长度不要超过 8 位 2.3.2 变量类型 C 语言中的变量遵循 先定义后使用的原则 变量定义的一般形式为 : 变量类型变量名表 ; 其中, 变量类型即为变量中所存储数据的类型, 如整型 (int) 单精度实型(float) 和字符型 (char) 等 变量表的形式是 : 变量名 1, 变量名 2,, 变量名 n, 最后用分号结束定义 例如, 下面是对某程序中的变量说明 : int a,b,c; /* 说明 a,b,c 为整型变量 */ 16

float f; /* 说明 f 为单精度实型变量 */ char c,cc; /* 说明 c,cc 为字符型变量 */ 注意 :C 语言规定, 所有变量先定义后使用是为了在编译时为该变量分配相应的存储单元 ( 不同类型的变量所占用的存储单元大小不同 ) 以及检查该变量名使用的正确性和该变量所进行运算的合法性 2.3.3 变量值 变量的值, 即为其存储的数据值 在程序中, 一个变量必须先有确定的值后才能参与各种相应的操作 变量可以通过赋值语句或输入语句获得一个值, 也可以用初始化的方法获得一个值 赋值语句 : 程序运行阶段将值赋给变量, 允许在一条语句中为多个变量同时赋值 例如 : int a; /* 定义整型变量 a*/ a=2; /* 使变量 a 的值为 2*/ 初始化 : 编译时将变量的值存放到系统为变量分配的内存单元中去, 必须逐个变量逐一赋初值 例如 : int a=2; /* 定义整型变量 a, 并使 a 值为 2*/ 2.4 运算符及表达式 2.4.1 C 运算符简介 C 语言提供了丰富的运算符和表达式, 这些丰富的运算符使 C 语言具有很强的表达能力 1. 运算符 C 语言的运算符按照它们的功能可分为 : 1) 算术运算符 ( + * / % ++ ) 2) 关系运算符 ( > < = = >= <=!= ) 3) 逻辑运算符 (! && ) 4) 位运算符 ( << >> ~ ^ & ) 5) 赋值运算符 ( = 复合赋值运算符 ) 6) 条件运算符 (?:) 7) 逗号运算符 (, ) 8) 指针运算符 ( * & ) 9) 求字节数运算符 ( sizeof ) 10) 强制类型转换运算符 ( ( 类型 )) 11) 分量运算符 (. -> ) 12) 下标运算符 ( [ ] ) 13) 其他 ( 如函数调用运算符 ()) 17

若按其在表达式中与运算对象的关系 ( 连接运算对象的个数 ) 可分为 : 1) 单目运算符 ( 一个运算符连接一个运算对象 ):! ~ ++ ( 取负号 ) * & sizeof ( 类型 ) 2) 双目运算符 ( 一个运算符连接两个运算对象 ): + * / % > < = = >= <=!= && << >> ^ & = 复合赋值运算符 3) 三目运算符 ( 一个运算符连接三个运算对象 ): 18?: 4) 其他 ( ) [ ] -> 2. C 运算符的优先级和结合性 C 语言中的运算具有一般数学运算的概念, 即具有优先级和结合性 ( 也称为结合方向 ) 1) 优先级 : 指同一个表达式中不同运算符进行运算时的先后次序 通常所有单目运算的优先级高于双目运算 2) 结合性 : 指在表达式中各种运算符优先级相同时, 由运算符的结合性确定表达式的运算顺序 它分为两类 : 一类运算符的结合性为从左到右, 称为左结合性 ; 另一类运算符的结合性是从右到左, 称为右结合性 通常单目 三目和赋值运算符的是右结合性, 其余均为左结合性 关于 C 语言运算符的种类 优先级和结合性见附录 IV 3. 表达式 表达式就是用运算符将操作数连接起来所构成的式子 操作数可以是常量 变量和函数 各种运算符能够连接的操作数的个数 数据类型都有各自的规定, 要书写正确的表达式就必须遵循这些规定 例如, 下面是一个合法的 C 表达式 : 10+ a +d/e-i*f 每个表达式不管多复杂, 都有一个值 这个值就是对操作数依照表达式中运算符规定的运算后计算出来的结果 求表达式的值是由计算机系统来完成的, 但程序设计者必须明白其运算步骤 优先级 结合性和数据类型转换这几方面的问题, 否则就得不到正确的结果 2.4.2 算术运算符与算术表达式 算术运算符用于各类数值运算, 包括 + - * / % ++ 和 -- 七种 表 2.3 列出了各种算术运算符的属性 1. 基本的算术运算符 基本的算术运算符包括 + - * / 和 % 在基本的算术运算符中, 单目运算符 (+ -) 的优先级高于双目 (+ - * / %) 的 双目运算符的优先级从高到低为 :(* / %)

(+ -) 其中,* / % 处于同一级别 ;+ - 处于同一级别, 如图 2.2 所示 表 2.3 算术运算符 运算符号 操作数数目 名称 运算规则 适用的数据类型 举例 + 单目 正 取原值 int,float +5 - 单目 负 取负值 int,float -5 + 双目 加 加法 int,char,float a+b - 双目 减 减法 int,char,float a-b * 双目 乘 乘法 int,char,float a*b / 双目 除 除法 int,char,float a/b % 双目 模 求余数 int,float 5%7 ++ 单目 自增 自增 1 int,float a++ -- 单目 自减 自减 1 int,float a-- 图 2.2 算术运算符的优先级 例 2.3 基本算术运算符运算 2+8/4 结果为 4 3.0+8.0/-4.0 结果为 1.0 3+10%5 结果为 3 45%4 结果为 1 3+10.5%5.0 结果出错 (3+8)/5 结果为 2 从以上例子可以看出, 进行基本的算术运算时应该注意的是 : 1) 除法运算的两个操作数如果都是整数, 则结果为整数, 小数部分一律舍去 ; 如果都是实数, 则结果为实数 2) 取余数运算的两个操作数必须是整数, 其结果也为整数 3) 圆括号 () 的优先级最高 例 2.4 整数相除的问题 main() { float f; f=3/5; printf( %f\n,f); } 运行结果为 : 0.000000 19