第1章 初识C语言 1
C语言的起源 1
选择C语言的理由 2
设计特性 2
高效性 3
可移植性 3
强大而灵活 3
面向程序员 3
缺点 4
C语言的应用范围 4
计算机能做什么 5
高级计算机语言和编译器 6
语言标准 7
第1个ANSI/ISO C标准 8
C99标准 8
C11标准 9
使用C语言的几个步骤 9
第1步:定义程序的目标 10
第2步:设计程序 10
第3步:编写代码 11
第4步:编译 11
第5步:运行程序 12
第6步:测试和调试程序 12
第7步:维护和修改代码 13
说明 13
编程机制 13
目标代码文件、可执行文件和库 14
系统 16
GNU编译器集合和LLVM项目 18
Linux系统 18
PC的命令行编译器 19
集成开发环境(Windows) 19
Windows/Linux 21
Macintosh中的C 21
本书的组织结构 22
本书的约定 22
字体 22
程序输出 23
特殊元素 24
本章小结 24
复习题 25
编程练习 25
第2章 C语言概述 27
简单的C程序示例 27
示例解释 28
第1遍:快速概要 30
第2遍:程序细节 31
简单程序的结构 40
提高程序可读性的技巧 41
进一步使用C 42
程序说明 43
多条声明 43
乘法 43
打印多个值 43
多个函数 44
调试程序 46
语法错误 46
语义错误 47
程序状态 49
关键字和保留标识符 49
关键概念 50
本章小结 51
复习题 51
编程练习 53
第3章 数据和C 55
示例程序 55
程序中的新元素 57
变量与常量数据 59
数据:数据类型关键字 59
整数和浮点数 60
整数 61
浮点数 61
语言基本数据类型 62
int类型 62
其他整数类型 66
使用字符:char类型 71
Bool类型 77
可移植类型:stdint.h和inttypes.h 77
float、double和 long double 79
复数和虚数类型 85
其他类型 85
类型大小 87
使用数据类型 88
参数和陷阱 89
转义序列示例 91
程序运行情况 91
刷新输出 92
关键概念 93
本章小结 93
复习题 94
编程练习 97
第4章 字符串和格式化输入/输出 99
前导程序 99
字符串简介 101
char类型数组和null字符 101
使用字符串 102
strlen()函数 103
常量和C预处理器 106
const限定符 109
明示常量 109
printf()和scanf() 112
printf()函数 112
使用printf() 113
printf()的转换说明修饰符 115
转换说明的意义 122
使用scanf() 128
printf()和scanf()的*修饰符 133
printf()的用法提示 135
关键概念 136
本章小结 137
复习题 138
编程练习 140
第5章 运算符、表达式和语句 143
循环简介 144
基本运算符 146
赋值运算符:= 146
加法运算符:+ 149
减法运算符:- 149
符号运算符:-和+ 150
乘法运算符:* 151
除法运算符:/ 153
运算符优先级 154
优先级和求值顺序 156
其他运算符 157
sizeof运算符和size_t类型 158
求模运算符:% 159
递增和递减运算符:++和-- 160
递减运算符:-- 164
优先级 165
不要自作聪明 166
表达式和语句 167
表达式 167
语句 168
复合语句(块) 171
类型转换 174
强制类型转换运算符 176
带参数的函数 177
示例程序 180
关键概念 182
本章小结 182
复习题 183
编程练习 187
第6章 C控制语句:循环 189
再探while循环 190
程序注释 191
C风格读取循环 192
while语句 193
终止while循环 194
何时终止循环 194
while:入口条件循环 195
语法要点 195
用关系运算符和表达式比较大小 197
什么是真 199
其他真值 200
真值的问题 201
新的_Bool类型 203
优先级和关系运算符 205
不确定循环和计数循环 207
for循环 208
利用for的灵活性 210
其他赋值运算符:+=、-=、*=、/=、%= 215
逗号运算符 215
当Zeno遇到for循环 218
出口条件循环:do while 220
如何选择循环 223
嵌套循环 224
程序分析 225
嵌套变式 225
数组简介 226
在for循环中使用数组 228
使用函数返回值的循环示例 230
程序分析 232
使用带返回值的函数 233
关键概念 234
本章小结 235
复习题 236
编程练习 241
第7章 C控制语句:分支和跳转 245
if语句 246
if else语句 248
另一个示例:介绍getchar()和putchar() 250
ctype.h系列的字符函数 252
多重选择else if 254
else与if配对 257
多层嵌套的if语句 259
逻辑运算符 263
备选拼写:iso64 6.h头文件 265
优先级 265
求值顺序 266
范围 267
一个统计单词的程序 268
条件运算符:?: 271
循环辅助:continue和break 274
continue语句 274
break语句 277
多重选择:switch和break 280
switch语句 281
只读每行的首字符 283
多重标签 284
switch和if else 286
goto语句 287
避免使用goto 287
关键概念 291
本章小结 291
复习题 292
编程练习 296
第8章 字符输入/输出和输入验证 299
单字符I/O:getchar()和putchar() 300
缓冲区 301
结束键盘输入 302
文件、流和键盘输入 303
文件结尾 304
重定向和文件 307
Unix、Linux和DOS重定向 307
创建更友好的用户界面 312
使用缓冲输入 312
混合数值和字符输入 314
输入验证 317
分析程序 322
输入流和数字 323
菜单浏览 324
任务 324
使执行更顺利 325
混合字符和数值输入 327
关键概念 330
本章小结 331
复习题 331
编程练习 332
第9章 函数 335
复习函数 335
创建并使用简单函数 337
分析程序 338
函数参数 340
定义带形式参数的函数 342
声明带形式参数函数的原型 343
调用带实际参数的函数 343
黑盒视角 345
使用return从函数中返回值 345
函数类型 348
ANSI C函数原型 349
问题所在 350
ANSI的解决方案 351
无参数和未指定参数 352
函数原型的优点 353
递归 353
演示递归 354
递归的基本原理 355
尾递归 356
递归和倒序计算 358
递归的优缺点 360
编译多源代码文件的程序 361
Unix 362
Linux 362
DOS命令行编译器 362
Windows和苹果的IDE编译器 362
使用头文件 363
查找地址:&运算符 367
更改主调函数中的变量 369
指针简介 371
间接运算符:* 371
声明指针 372
使用指针在函数间通信 373
关键概念 378
本章小结 378
复习题 379
编程练习 380
第10章 数组和指针 383
数组 383
初始化数组 384
指定初始化器(C99) 388
给数组元素赋值 390
数组边界 390
指定数组的大小 392
多维数组 393
初始化二维数组 397
其他多维数组 398
指针和数组 398
函数、数组和指针 401
使用指针形参 404
指针表示法和数组表示法 407
指针操作 407
保护数组中的数据 412
对形式参数使用const 413
const的其他内容 415
指针和多维数组 417
指向多维数组的指针 420
指针的兼容性 421
函数和多维数组 423
变长数组(VLA) 427
复合字面量 431
关键概念 434
本章小结 435
复习题 436
编程练习 439
第11章 字符串和字符串函数 441
表示字符串和字符串I/O 441
在程序中定义字符串 442
指针和字符串 451
字符串输入 453
分配空间 453
不幸的gets()函数 453
gets()的替代品 455
scanf()函数 462
字符串输出 464
puts()函数 464
fputs()函数 465
printf()函数 466
自定义输入/输出函数 466
字符串函数 469
strlen()函数 469
strcat()函数 471
strncat()函数 473
strcmp()函数 475
strcpy()和strncpy()函数 482
sprintf()函数 487
其他字符串函数 489
字符串示例:字符串排序 491
排序指针而非字符串 493
选择排序算法 494
ctype.h字符函数和字符串 495
命令行参数 497
集成环境中的命令行参数 500
Macintosh中的命令行参数 500
把字符串转换为数字 500
关键概念 504
本章小结 504
复习题 505
编程练习 508