互联网
类型
9.4
豆瓣评分
可以朗读
语音朗读
624千字
字数
2010-02-01
发行日期
展开全部
主编推荐语
近10年来难得的一部C语言著作。哈佛、麻省理工、斯坦福都在用的C语言经典教材。
内容简介
本书最主要的一个目的就是通过一种“现代方法”来介绍C语言,书中强调标准C,强调软件工程,不再强调“手工优化”。这一版中紧密结合了C99标准,并与C89标准进行对照,补充了C99中的最新特性。
本书分为C语言的基础特性、C语言的高级特性、C语言标准库和参考资料4个部分。每章末尾都有一个“问与答”小节给出一系列与该章内容相关的问题及答案,此外还包含适量的习题。
本书是为大学本科阶段的C语言课程编写的教材,同时也非常适合作为其他课程的辅助用书。
目录
- 版权信息
- 版权声明
- 内容提要
- 前言
- 第1章 C语言概述
- 1.1 C语言的历史
- 1.1.1 起源
- 1.1.2 标准化
- 1.1.3 基于C的语言
- 1.2 C语言的优缺点
- 1.2.1 C语言的优点
- 1.2.2 C语言的缺点
- 1.2.3 高效地使用C语言
- 问与答
- 第2章 C语言基本概念
- 2.1 编写一个简单的C程序
- 2.1.1 编译和链接
- 2.1.2 集成开发环境
- 2.2 简单程序的一般形式
- 2.2.1 指令
- 2.2.2 函数
- 2.2.3 语句
- 2.2.4 显示字符串
- 2.3 注释
- 2.4 变量和赋值
- 2.4.1 类型
- 2.4.2 声明
- 2.4.3 赋值
- 2.4.4 显示变量的值
- 2.4.5 初始化
- 2.4.6 显示表达式的值
- 2.5 读入输入
- 2.6 定义常量的名字
- 2.7 标识符
- 关键字
- 2.8 C程序的书写规范
- 问与答
- 练习题(1)
- 编程题
- 第3章 格式化输入/输出
- 3.1 printf函数
- 3.1.1 转换说明
- 3.1.2 转义序列
- 3.2 scanf函数
- 3.2.1 scanf函数的工作方法
- 3.2.2 格式串中的普通字符
- 3.2.3 易混淆的printf函数和scanf函数
- 问与答
- 练习
- 编程题
- 第4章 表达式
- 4.1 算术运算符
- 运算符的优先级和结合性
- 4.2 赋值运算符
- 4.2.1 简单赋值
- 4.2.2 左值
- 4.2.3 复合赋值
- 4.3 自增运算符和自减运算符
- 4.4 表达式求值
- 子表达式的求值顺序
- 4.5 表达式语句
- 问与答
- 练习题
- 编程题
- 第5章 选择语句
- 5.1 逻辑表达式
- 5.1.1 关系运算符
- 5.1.2 判等运算符
- 5.1.3 逻辑运算符
- 5.2 if语句
- 5.2.1 复合语句
- 5.2.2 else子句
- 5.2.3 级联式if语句
- 5.2.4 “悬空else”的问题
- 5.2.5 条件表达式
- 5.2.6 C89中的布尔值
- 5.2.7 C99中的布尔值
- 5.3 switch语句
- break语句的作用
- 问与答
- 练习题
- 编程题
- 第6章 循环
- 6.1 while语句
- 无限循环
- 6.2 do语句
- 6.3 for语句
- 6.3.1 for语句的惯用法
- 6.3.2 在for语句中省略表达式
- 6.3.3 C99中的for语句
- 6.3.4 逗号运算符
- 6.4 退出循环
- 6.4.1 break语句
- 6.4.2 continue语句
- 6.4.3 goto语句
- 6.5 空语句
- 问与答
- 练习题
- 编程题
- 第7章 基本类型
- 7.1 整数类型
- 7.1.1 C99中的整数类型
- 7.1.2 整数常量
- 7.1.3 C99中的整数常量
- 7.1.4 整数溢出
- 7.1.5 读/写整数
- 7.2 浮点类型
- 7.2.1 浮点常量
- 7.2.2 读/写浮点数
- 7.3 字符类型
- 7.3.1 字符操作
- 7.3.2 有符号字符和无符号字符
- 7.3.3 算术类型
- 7.3.4 转义序列
- 7.3.5 字符处理函数
- 7.3.6 用scanf和printf读/写字符
- 7.3.7 用getchar和putchar读/写字符
- 7.4 类型转换
- 7.4.1 常用算术转换
- 7.4.2 赋值过程中的转换
- 7.4.3 C99中的隐式转换
- 7.4.4 强制类型转换
- 7.5 类型定义
- 7.5.1 类型定义的优点
- 7.5.2 类型定义和可移植性
- 7.6 sizeof运算符
- 问与答
- 练习题
- 编程题
- 第8章 数组
- 8.1 一维数组
- 8.1.1 数组下标
- 8.1.2 数组初始化
- 8.1.3 指定初始化式
- 8.1.4 对数组使用sizeof运算符
- 8.2 多维数组
- 8.2.1 多维数组初始化
- 8.2.2 常量数组
- 8.3 C99中的变长数组
- 问与答
- 练习题
- 编程题
- 第9章 函数
- 9.1 函数的定义和调用
- 9.1.1 函数定义
- 9.1.2 函数调用
- 9.2 函数声明
- 9.3 实际参数
- 9.3.1 实际参数的转换
- 9.3.2 数组型实际参数
- 9.3.3 变长数组形式参数
- 9.3.4 在数组参数声明中使用static
- 9.3.5 复合字面量
- 9.4 return语句
- 9.5 程序终止
- exit函数
- 9.6 递归
- 快速排序算法
- 问与答
- 练习题
- 编程题
- 第10章 程序结构
- 10.1 局部变量
- 10.1.1 静态局部变量
- 10.1.2 形式参数
- 10.2 外部变量
- 10.2.1 示例:用外部变量实现栈
- 10.2.2 外部变量的利与弊
- 10.3 程序块
- 10.4 作用域
- 10.5 构建C程序
- 问与答
- 练习题
- 编程题
- 第11章 指针
- 11.1 指针变量
- 指针变量的声明
- 11.2 取地址运算符和间接寻址运算符
- 11.2.1 取地址运算符
- 11.2.2 间接寻址运算符
- 11.3 指针赋值
- 11.4 指针作为参数
- 用const保护参数
- 11.5 指针作为返回值
- 问与答
- 练习题
- 编程题
- 第12章 指针和数组
- 12.1 指针的算术运算
- 12.1.1 指针加上整数
- 12.1.2 指针减去整数
- 12.1.3 两个指针相减
- 12.1.4 指针比较
- 12.1.5 指向复合常量的指针
- 12.2 指针用于数组处理
- *运算符和++运算符的组合
- 12.3 用数组名作为指针
- 12.3.1 数组型实际参数(改进版)
- 12.3.2 用指针作为数组名
- 12.4 指针和多维数组
- 12.4.1 处理多维数组的元素
- 12.4.2 处理多维数组的行
- 12.4.3 处理多维数组的列
- 12.4.4 用多维数组名作为指针
- 12.5 C99中的指针和变长数组
- 问与答
- 练习题
- 编程题
- 第13章 字符串
- 13.1 字符串字面量
- 13.1.1 字符串字面量中的转义序列
- 13.1.2 延续字符串字面量
- 13.1.3 如何存储字符串字面量
- 13.1.4 字符串字面量的操作
- 13.1.5 字符串字面量与字符常量
- 13.2 字符串变量
- 13.2.1 初始化字符串变量
- 13.2.2 字符数组与字符指针
- 13.3 字符串的读和写
- 13.3.1 用printf函数和puts函数写字符串
- 13.3.2 用scanf函数和gets函数读字符串
- 13.3.3 逐个字符读字符串
- 13.4 访问字符串中的字符
- 13.5 使用C语言的字符串库
- 13.5.1 strcpy函数
- 13.5.2 strlen函数
- 13.5.3 strcat函数
- 13.5.4 strcmp函数
- 13.6 字符串惯用法
- 13.6.1 搜索字符串的结尾
- 13.6.2 复制字符串
- 13.7 字符串数组
- 命令行参数
- 问与答
- 练习题
- 编程题
- 第14章 预处理器
- 14.1 预处理器的工作原理
- 14.2 预处理指令
- 14.3 宏定义
- 14.3.1 简单的宏
- 14.3.2 带参数的宏
- 14.3.3 #运算符
- 14.3.4 ##运算符
- 14.3.5 宏的通用属性
- 14.3.6 宏定义中的圆括号
- 14.3.7 创建较长的宏
- 14.3.8 预定义宏
- 14.3.9 C99中新增的预定义宏
- 14.3.10 空的宏参数
- 14.3.11 参数个数可变的宏
- 14.3.12 __func__标识符
- 14.4 条件编译
- 14.4.1 #if指令和#endif指令
- 14.4.2 defined运算符
- 14.4.3 #ifdef指令和#ifndef指令
- 14.4.4 #elif指令和#else指令
- 14.4.5 使用条件编译
- 14.5 其他指令
- 14.5.1 #error指令
- 14.5.2 #line指令
- 14.5.3 #pragma指令
- 14.5.4 _Pragma运算符
- 问与答
- 练习题
- 第15章 编写大型程序
- 15.1 源文件
- 15.2 头文件
- 15.2.1 #include指令
- 15.2.2 共享宏定义和类型定义
- 15.2.3 共享函数原型
- 15.2.4 共享变量声明
- 15.2.5 嵌套包含
- 15.2.6 保护头文件
- 15.2.7 头文件中的#error指令
- 15.3 把程序划分成多个文件
- 15.4 构建多文件程序
- 15.4.1 makefile
- 15.4.2 链接期间的错误
- 15.4.3 重新构建程序
- 15.4.4 在程序外定义宏
- 问与答
- 练习题
- 编程题
- 第16章 结构、联合和枚举
- 16.1 结构变量
- 16.1.1 结构变量的声明
- 16.1.2 结构变量的初始化
- 16.1.3 指定初始化
- 16.1.4 对结构的操作
- 16.2 结构类型
- 16.2.1 结构标记的声明
- 16.2.2 结构类型的定义
- 16.2.3 结构作为参数和返回值
- 16.2.4 复合字面量
- 16.3 嵌套的数组和结构
- 16.3.1 嵌套的结构
- 16.3.2 结构数组
- 16.3.3 结构数组的初始化
- 16.4 联合
- 16.4.1 用联合来节省空间
- 16.4.2 用联合来构造混合的数据结构
- 16.4.3 为联合添加“标记字段”
- 16.5 枚举
- 16.5.1 枚举标记和类型名
- 16.5.2 枚举作为整数
- 16.5.3 用枚举声明“标记字段”
- 问与答
- 练习题
- 编程题
- 第17章 指针的高级应用
- 17.1 动态存储分配
- 17.1.1 内存分配函数
- 17.1.2 空指针
- 17.2 动态分配字符串
- 17.2.1 使用malloc函数为字符串分配内存
- 17.2.2 在字符串函数中使用动态存储分配
- 17.2.3 动态分配字符串的数组
- 17.3 动态分配数组
- 17.3.1 使用malloc函数为数组分配存储空间
- 17.3.2 calloc函数
- 17.3.3 realloc函数
- 17.4 释放存储空间
- 17.4.1 free函数
- 17.4.2 “悬空指针”问题
- 17.5 链表
- 17.5.1 声明结点类型
- 17.5.2 创建结点
- 17.5.3 ->运算符
- 17.5.4 在链表的开始处插入结点
- 17.5.5 搜索链表
- 17.5.6 从链表中删除结点
- 17.5.7 有序链表
- 17.6 指向指针的指针
- 17.7 指向函数的指针
- 17.7.1 函数指针作为参数
- 17.7.2 qsort函数
- 17.7.3 函数指针的其他用途
- 17.8 受限指针
- 17.9 灵活数组成员
- 问与答
- 练习题
- 编程题
- 第18章 声明
- 18.1 声明的语法
- 18.2 存储类型
- 18.2.1 变量的性质
- 18.2.2 auto存储类型
- 18.2.3 static存储类型
- 18.2.4 extern存储类型
- 18.2.5 register存储类型
- 18.2.6 函数的存储类型
- 18.2.7 小结
- 18.3 类型限定符
- 18.4 声明符
- 18.4.1 解释复杂声明
- 18.4.2 使用类型定义来简化声明
- 18.5 初始化式
- 未初始化的变量
- 18.6 内联函数
- 18.6.1 内联定义
- 18.6.2 对内联函数的限制
- 18.6.3 在GCC中使用内联函数
- 问与答
- 练习题
- 第19章 程序设计
- 19.1 模块
- 19.1.1 内聚性与耦合性
- 19.1.2 模块的类型
- 19.2 信息隐藏
- 栈模块
- 19.3 抽象数据类型
- 19.3.1 封装
- 19.3.2 不完整类型
- 19.4 栈抽象数据类型
- 19.4.1 为栈抽象数据类型定义接口
- 19.4.2 用定长数组实现栈抽象数据类型
- 19.4.3 改变栈抽象数据类型中数据项的类型
- 19.4.4 用动态数组实现栈抽象数据类型
- 19.4.5 用链表实现栈抽象数据类型
- 19.5 抽象数据类型的设计问题
- 19.5.1 命名惯例
- 19.5.2 错误处理
- 19.5.3 通用抽象数据类型
- 19.5.4 新语言中的抽象数据类型
- 问与答
- 练习题
- 编程题
- 第20章 底层程序设计
- 20.1 位运算符
- 20.1.1 移位运算符
- 20.1.2 按位求反运算符、按位与运算符、按位异或运算符和按位或运算符
- 20.1.3 用位运算符访问位
- 20.1.4 用位运算符访问位域
- 20.2 结构中的位域
- 位域是如何存储的
- 20.3 其他底层技术
- 20.3.1 定义依赖机器的类型
- 20.3.2 用联合提供数据的多个视角
- 20.3.3 将指针作为地址使用
- 20.3.4 volatile类型限定符
- 问与答
- 练习题
- 编程题
- 第21章 标准库
- 21.1 标准库的使用
- 21.1.1 对标准库中所用名字的限制
- 21.1.2 使用宏隐藏的函数
- 21.2 C89标准库概述
- 21.3 C99标准库更新
- 21.4 <stddef.h>:常用定义
- 21.5 <stdbool.h>:布尔类型和值
- 问与答
- 练习题
- 编程题
- 第22章 输入/输出
- 22.1 流
- 22.1.1 文件指针
- 22.1.2 标准流和重定向
- 22.1.3 文本文件与二进制文件
- 22.2 文件操作
- 22.2.1 打开文件
- 22.2.2 模式
- 22.2.3 关闭文件
- 22.2.4 为打开的流附加文件
- 22.2.5 从命令行获取文件名
- 22.2.6 临时文件
- 22.2.7 文件缓冲
- 22.2.8 其他文件操作
- 22.3 格式化的输入/输出
- 22.3.1 …printf函数
- 22.3.2 …printf转换说明
- 22.3.3 C99对…printf转换说明的修改
- 22.3.4 …printf转换说明示例
- 22.3.5 …scanf函数
- 22.3.6 …scanf格式串
- 22.3.7 …scanf转换说明
- 22.3.8 C99对...scanf转换说明的改变
- 22.3.9 scanf示例
- 22.3.10 检测文件末尾和错误条件
- 22.4 字符的输入/输出
- 22.4.1 输出函数
- 22.4.2 输入函数
- 22.5 行的输入/输出
- 22.5.1 输出函数
- 22.5.2 输入函数
- 22.6 块的输入/输出
- 22.7 文件定位
- 22.8 字符串的输入/输出
- 22.8.1 输出函数
- 22.8.2 输入函数
- 问与答
- 练习题
- 编程题
- 第23章 库对数值和字符数据的支持
- 23.1 <float.h>:浮点类型的特性
- 23.2 <limits.h>:整数类型的大小
- 23.3 <math.h>:数学计算(C89)
- 23.3.1 错误
- 23.3.2 三角函数
- 23.3.3 双曲函数
- 23.3.4 指数函数和对数函数
- 23.3.5 幂函数
- 23.3.6 就近取整函数、绝对值函数和取余函数
- 23.4 <math.h>:数学计算(C99)
- 23.4.1 IEEE浮点标准
- 23.4.2 类型
- 23.4.3 宏
- 23.4.4 错误
- 23.4.5 函数
- 23.4.6 分类宏
- 23.4.7 三角函数
- 23.4.8 双曲函数
- 23.4.9 指数函数和对数函数
- 23.4.10 幂函数和绝对值函数
- 23.4.11 误差函数和伽玛函数
- 23.4.12 就近取整函数
- 23.4.13 取余函数
- 23.4.14 操作函数
- 23.4.15 最大值函数、最小值函数和正差函数
- 23.4.16 浮点乘加
- 23.4.17 比较宏
- 23.5 <ctype.h>:字符处理
- 23.5.1 字符分类函数
- 23.5.2 字符大小写映射函数
- 23.6 <string.h>:字符串处理
- 23.6.1 复制函数
- 23.6.2 拼接函数
- 23.6.3 比较函数
- 23.6.4 搜索函数
- 23.6.5 其他函数
- 问与答
- 练习题
- 编程题
- 第24章 错误处理
- 24.1 <assert.h>:诊断
- 24.2 <errno.h>:错误
- perror函数和strerror函数
- 24.3 <signal.h>:信号处理
- 24.3.1 信号宏
- 24.3.2 signal函数
- 24.3.3 预定义的信号处理函数
- 24.3.4 raise函数
- 24.4 <setjmp.h>:非局部跳转
- 问与答
- 练习题
- 第25章 国际化特性
- 25.1 <locale.h>:本地化
- 25.1.1 类别
- 25.1.2 setlocale函数
- 25.1.3 localeconv函数
- 25.2 多字节字符和宽字符
- 25.2.1 多字节字符
- 25.2.2 宽字符
- 25.2.3 统一码和通用字符集
- 25.2.4 统一码编码
- 25.2.5 多字节/宽字符转换函数
- 25.2.6 多字节/宽字符串转换函数
- 25.3 双字符和三字符
- 25.3.1 三字符
- 25.3.2 双字符
- 25.3.3 <iso646.h>:拼写替换
- 25.4 通用字符名
- 25.5 <wchar.h>:扩展的多字节和宽字符实用工具
- 25.5.1 流倾向
- 25.5.2 格式化宽字符输入/输出函数
- 25.5.3 宽字符输入/输出函数
- 25.5.4 通用的宽字符串实用工具
- 25.5.5 宽字符时间转换函数
- 25.5.6 扩展的多字节/宽字符转换实用工具
- 25.6 <wctype.h>:宽字符分类和映射实用工具
- 25.6.1 宽字符分类函数
- 25.6.2 可扩展的宽字符分类函数
- 25.6.3 宽字符大小写映射函数
- 25.6.4 可扩展的宽字符大小写映射函数
- 问与答
- 练习题
- 编程题
- 第26章 其他库函数
- 26.1 <stdarg.h>:可变参数
- 26.1.1 调用带有可变参数列表的函数
- 26.1.2 v…printf函数
- 26.1.3 v…scanf函数
- 26.2 <stdlib.h>:通用的实用工具
- 26.2.1 数值转换函数
- 26.2.2 伪随机序列生成函数
- 26.2.3 与环境的通信
- 26.2.4 搜索和排序实用工具
- 26.2.5 整数算术运算函数
- 26.3 <time.h>:日期和时间
- 26.3.1 时间处理函数
- 26.3.2 时间转换函数
- 问与答
- 练习题
- 编程题
- 第27章 C99对数学计算的新增支持
- 27.1 <stdint.h>:整数类型
- 27.1.1 <stdint.h>类型
- 27.1.2 对指定宽度整数类型的限制
- 27.1.3 对其他整数类型的限制
- 27.1.4 用于整数常量的宏
- 27.2 <inttypes.h>:整数类型的格式转换
- 27.2.1 用于格式说明符的宏
- 27.2.2 用于最大宽度整数类型的函数
- 27.3 复数
- 27.3.1 复数的定义
- 27.3.2 复数的算术运算
- 27.3.3 C99中的复数类型
- 27.3.4 复数的运算
- 27.3.5 复数类型的转换规则
- 27.4 <complex.h>:复数算术运算
- 27.4.1 <complex.h>宏
- 27.4.2 CX_LIMITED_RANGE编译提示
- 27.4.3 <complex.h>函数
- 27.4.4 三角函数
- 27.4.5 双曲函数
- 27.4.6 指数函数和对数函数
- 27.4.7 幂函数和绝对值函数
- 27.4.8 操作函数
- 27.5 <tgmath.h>:泛型数学
- 27.5.1 泛型宏
- 27.5.2 调用泛型宏
- 27.6 <fenv.h>:浮点环境
- 27.6.1 浮点状态标志和控制模式
- 27.6.2 <fenv.h>宏
- 27.6.3 FENV_ACCESS编译提示
- 27.6.4 浮点异常函数
- 27.6.5 舍入函数
- 27.6.6 环境函数
- 问与答
- 练习题
- 编程题
- 附录A C语言运算符
- 附录B C99与C89的比较
- 附录C C89与经典C的比较
- 附录D 标准库函数
- 附录E ASCII字符集
- 参考文献
- 索引
展开全部
出版方
人民邮电出版社·图灵出品
图灵社区成立于2005年6月,由人民邮电出版社投资控股,以策划出版高质量的科技书籍为核心业务,主要出版领域包括计算机、电子电气、数学统计、科普等,通过引进国际高水平的教材、专著,以及发掘国内优秀原创作品等途径,为目标读者提供一流的内容。