展开全部

主编推荐语

近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月,由人民邮电出版社投资控股,以策划出版高质量的科技书籍为核心业务,主要出版领域包括计算机、电子电气、数学统计、科普等,通过引进国际高水平的教材、专著,以及发掘国内优秀原创作品等途径,为目标读者提供一流的内容。