编辑推荐

经久不衰的C语言畅销经典教程
针对C11标准进行全面更新

《CPrimerPlus(第6版)中文版》是一本经过仔细测试、精心设计的完整C语言教程,它涵盖了C语言编程中的核心内容。《CPrimerPlus(第6版)中文版》作为计算机科学的经典著作,讲解了包含结构化代码和自顶向下设计在内的程序设计原则。
与以前的版本一样,作者的目标仍旧是为读者提供一本入门型、条理清晰、见解深刻的C语言教程。作者把基础的编程概念与C语言的细节很好地融合在一起,并通过大量短小精悍的示例同时演示一两个概念,通过学以致用的方式鼓励读者掌握新的主题。
每章末尾的复习题和编程练习题进一步强化了重要的信息,有助于读者理解和消化那些难以理解的概念。《C Primer Plus 第6版 中文版》采用了友好、易于使用的编排方式,不仅适合打算认真学习C语言编程的学生阅读,也适合那些精通其他编程语言,但希望更好地掌握C语言这门核心语言的开发人员阅读。
《CPrimerPlus(第6版)中文版》在之前版本的基础之上进行了全新升级,它涵盖了C语言新的进展以及C11标准的详细内容。《C Primer Plus 第6版 中文版》还提供了大量深度与广度齐备的教学技术和工具,来提高你的学习。

详细完整地讨论了C语言的基础特性和附加特性;
清晰解释了使用C语言不同部分的时机,以及原因;
通过简洁、简单的示例加强读者的动手练习,以帮助一次理解一两个概念;
囊括了数百个实用的代码示例;
每章末尾的复习题和编程练习可以检测你的理解情况。
涵盖了C泛型编程,以提供灵活性。

内容简介

《CPrimerPlus(第6版)中文版》详细讲解了C语言的基本概念和编程技巧。
《CPrimerPlus(第6版)中文版》共17章。第1、2章介绍了C语言编程的预备知识。第3~15章详细讲解了C语言的相关知识,包括数据类型、格式化输入/输出、运算符、表达式、语句、循环、字符输入和输出、函数、数组和指针、字符和字符串函数、内存管理、文件输入输出、结构、位操作等。第16章、17章介绍C预处理器、C库和高级数据表示。《C Primer Plus 第6版 中文版》以完整的程序为例,讲解C语言的知识要点和注意事项。每章末设计了大量复习题和编程练习,帮助读者巩固所学知识和提高实际编程能力。附录给出了各章复习题的参考答案和丰富的参考资料。
《CPrimerPlus(第6版)中文版》可作为C语言的教材,适用于需要系统学习C语言的初学者,也适用于巩固C语言知识或希望进一步提高编程技术的程序员。

作者简介

StephenPrata曾在加利福尼亚的马林学院(肯特菲尔德)教授天文学、物理学和程序设计课程,现已退休。他在加州理工学院获得学士学位,在加州大学伯克利分校获得博士学位。他接触程序设计,是为了利用计算机给星团建模。Stephen撰写和与他人合著了十几《C Primer Plus 第6版 中文版》籍,其中包括C++PrimerPlus和UnixPrimerPlus。

目录

第1章 初识C语言1
1.1 C语言的起源1
1.2选择C语言的理由1
1.2.1设计特性1
1.2.2高效性1
1.2.3可移植性2
1.2.4强大而灵活3
1.2.5面向程序员3
1.2.6缺点3
1.3C语言的应用范围3
1.4计算机能做什么4
1.5高级计算机语言和编译器5
1.6语言标准6
1.6.1第1个ANSI/ISOC标准6
1.6.2C99标准6
1.6.3C11标准7
1.7使用C语言的7个步骤7
1.7.1第1步:定义程序的目标8
1.7.2第2步:设计程序8
1.7.3第3步:编写代码8
1.7.4第4步:编译8
1.7.5第5步:运行程序9
1.7.6第6步:测试和调试程序9
1.7.7第7步:维护和修改代码9
1.7.8说明9
1.8编程机制10
1.8.1目标代码文件、可执行文件和库10
1.8.2UNIX系统11
1.8.3GNU编译器集合和LLVM项目13
1.8.4Linux系统13
1.8.5PC的命令行编译器14
1.8.6集成开发环境(Windows)14
1.8.7Windows/Linux15
1.8.8Macintosh中的C15
1.9《C Primer Plus 第6版 中文版》的组织结构15
1.10《C Primer Plus 第6版 中文版》的约定16
1.10.1字体16
1.10.2程序输出16
1.10.3特殊元素17
1.11本章小结17
1.12复习题18
1.13编程练习18
第2章 C语言概述19
2.1简单的C程序示例19
2.2示例解释20
2.2.1第1遍:快速概要21
2.2.2第2遍:程序细节21
2.3简单程序的结构28
2.4提高程序可读性的技巧28
2.5进一步使用C29
2.5.1程序说明30
2.5.2多条声明30
2.5.3乘法30
2.5.4打印多个值30
2.6多个函数30
2.7调试程序32
2.7.1语法错误32
2.7.2语义错误33
2.7.3程序状态34
2.8关键字和保留标识符34
2.9关键概念35
2.10本章小结35
2.11复习题36
2.12编程练习37
第3章 数据和C39
3.1示例程序39
3.2变量与常量数据42
3.3数据:数据类型关键字42
3.3.1整数和浮点数43
3.3.2整数43
3.3.3浮点数43
3.4C语言基本数据类型44
3.4.1int类型44
3.4.2其他整数类型47
3.4.3使用字符:char类型50
3.4.4_Bool类型54
3.4.5可移植类型:stdint.h和inttypes.h55
3.4.6float、double和longdouble56
3.4.7复数和虚数类型60
3.4.8其他类型60
3.4.9类型大小62
3.5使用数据类型63
3.6参数和陷阱63
3.7转义序列示例64
3.7.1程序运行情况65
3.7.2刷新输出65
3.8关键概念66
3.9本章小结66
3.10复习题67
3.11编程练习68
第4章 字符串和格式化输入/输出71
4.1前导程序71
4.2字符串简介72
4.2.1char类型数组和null字符72
4.2.2使用字符串73
4.2.3strlen()函数74
4.3常量和C预处理器76
4.3.1const限定符78
4.3.2明示常量78
4.4printf()和scanf()80
4.4.1printf()函数80
4.4.2使用printf()81
4.4.3printf()的转换说明修饰符83
4.4.4转换说明的意义87
4.4.5使用scanf()92
4.4.6printf()和scanf()的*修饰符95
4.4.7printf()的用法提示97
4.5关键概念98
4.6本章小结98
4.7复习题99
4.8编程练习100
第5章 运算符、表达式和语句103
5.1循环简介103
5.2基本运算符105
5.2.1赋值运算符:=105
5.2.2加法运算符:+107
5.2.3减法运算符:-107
5.2.4符号运算符:-和+107
5.2.5乘法运算符:*108
5.2.6除法运算符:/110
5.2.7运算符优先级110
5.2.8优先级和求值顺序112
5.3其他运算符113
5.3.1sizeof运算符和size_t类型113
5.3.2求模运算符:%114
5.3.3递增运算符:++115
5.3.4递减运算符:--118
5.3.5优先级118
5.3.6不要自作聪明119
5.4表达式和语句120
5.4.1表达式120
5.4.2语句120
5.4.3复合语句(块)123
5.5类型转换124
5.6带参数的函数127
5.7示例程序129
5.8关键概念130
5.9本章小结130
5.10复习题131
5.11编程练习134
第6章 C控制语句:循环137
6.1再探while循环137
6.1.1程序注释138
6.1.2C风格读取循环139
6.2while语句140
6.2.1终止while循环140
6.2.2何时终止循环141
6.2.3while:入口条件循环141
6.2.4语法要点141
6.3用关系运算符和表达式比较大小143
6.3.1什么是真144
6.3.2其他真值145
6.3.3真值的问题146
6.3.4新的_Bool类型147
6.3.5优先级和关系运算符148
6.4不确定循环和计数循环150
6.5for循环151
6.6其他赋值运算符:+=、-=、*=、/=、%=155
6.7逗号运算符156
6.8出口条件循环:dowhile159
6.9如何选择循环161
6.10嵌套循环162
6.10.1程序分析163
6.10.2嵌套变式163
6.11数组简介164
6.12使用函数返回值的循环示例166
6.12.1程序分析168
6.12.2使用带返回值的函数169
6.13关键概念169
6.14本章小结170
6.15复习题170
6.16编程练习174
第7章 C控制语句:分支和跳转177
7.1if语句177
7.2ifelse语句179
7.2.1另一个示例:介绍getchar()和putchar()180
7.2.2ctype.h系列的字符函数182
7.2.3多重选择elseif184
7.2.4else与if配对186
7.2.5多层嵌套的if语句187
7.3逻辑运算符190
7.3.1备选拼写:iso646.h头文件191
7.3.2优先级192
7.3.3求值顺序192
7.3.4范围193
7.4一个统计单词的程序194
7.5条件运算符:?:196
7.6循环辅助:continue和break198
7.6.1continue语句198
7.6.2break语句200
7.7多重选择:switch和break202
7.7.1switch语句204
7.7.2只读每行的首字符205
7.7.3多重标签206
7.7.4switch和ifelse208
7.8goto语句208
7.9关键概念211
7.10本章小结211
7.11复习题212
7.12编程练习214
第8章 字符输入/输出和输入验证217
8.1单字符I/O:getchar()和putchar()217
8.2缓冲区218
8.3结束键盘输入219
8.3.1文件、流和键盘输入219
8.3.2文件结尾220
8.4重定向和文件222
8.5创建更友好的用户界面226
8.5.1使用缓冲输入226
8.5.2混合数值和字符输入228
8.6输入验证230
8.6.1分析程序234
8.6.2输入流和数字234
8.7菜单浏览235
8.7.1任务235
8.7.2使执行更顺利235
8.7.3混合字符和数值输入237
8.8关键概念240
8.9本章小结240
8.10复习题241
8.11编程练习241
第9章 函数243
9.1复习函数243
9.1.1创建并使用简单函数244
9.1.2分析程序245
9.1.3函数参数247
9.1.4定义带形式参数的函数248
9.1.5声明带形式参数函数的原型249
9.1.6调用带实际参数的函数249
9.1.7黑盒视角250
9.1.8使用return从函数中返回值250
9.1.9函数类型252
9.2ANSIC函数原型253
9.2.1问题所在253
9.2.2ANSI的解决方案254
9.2.3无参数和未指定参数255
9.2.4函数原型的优点256
9.3递归256
9.3.1演示递归256
9.3.2递归的基本原理258
9.3.3尾递归258
9.3.4递归和倒序计算260
9.3.5递归的优缺点262
9.4编译多源代码文件的程序262
9.4.1UNIX263
9.4.2Linux263
9.4.3DOS命令行编译器263
9.4.4Windows和苹果的IDE编译器263
9.4.5使用头文件263
9.5查找地址:&运算符267
9.6更改主调函数中的变量268
9.7指针简介269
9.7.1间接运算符:*270
9.7.2声明指针270
9.7.3使用指针在函数间通信271
9.8关键概念274
9.9本章小结275
9.10 复习题275
9.11编程练习276
第10章 数组和指针277
10.1数组277
10.1.1初始化数组277
10.1.2指定初始化器(C99)281
10.1.3给数组元素赋值282
10.1.4数组边界282
10.1.5指定数组的大小284
10.2多维数组284
10.2.1初始化二维数组287
10.2.2其他多维数组288
10.3指针和数组288
10.4函数、数组和指针290
10.4.1使用指针形参293
10.4.2指针表示法和数组表示法294
10.5指针操作295
10.6保护数组中的数据298
10.6.1对形式参数使用const299
10.6.2 const的其他内容300
10.7指针和多维数组302
10.7.1指向多维数组的指针304
10.7.2指针的兼容性305
10.7.3函数和多维数组306
10.8变长数组(VLA)309
10.9复合字面量312
10.10关键概念314
10.11本章小结315
10.12复习题316
10.13编程练习317
第11章 字符串和字符串函数321
11.1表示字符串和字符串I/O321
11.1.1在程序中定义字符串322
11.1.2指针和字符串328
11.2字符串输入329
11.2.1分配空间329
11.2.2不幸的gets()函数330
11.2.3gets()的替代品331
11.2.4scanf()函数336
11.3字符串输出337
11.3.1puts()函数338
11.3.2fputs()函数339
11.3.3printf()函数339
11.4自定义输入/输出函数340
11.5字符串函数342
11.5.1strlen()函数342
11.5.2strcat()函数343
11.5.3strncat()函数345
11.5.4strcmp()函数346
11.5.5strcpy()和strncpy()函数351
11.5.6sprintf()函数356
11.5.7其他字符串函数357
11.6字符串示例:字符串排序359
11.6.1排序指针而非字符串360
11.6.2选择排序算法361
11.7ctype.h字符函数和字符串362
11.8命令行参数363
11.8.1集成环境中的命令行参数365
11.8.2Macintosh中的命令行参数365
11.9把字符串转换为数字365
11.10关键概念368
11.11本章小结368
11.12复习题369
11.13编程练习371
第12章 存储类别、链接和内存管理373
12.1存储类别373
12.1.1作用域374
12.1.2链接376
12.1.3存储期376
12.1.4自动变量377
12.1.5寄存器变量380
12.1.6块作用域的静态变量381
12.1.7外部链接的静态变量382
12.1.8内部链接的静态变量386
12.1.9多文件386
12.1.10存储类别说明符387
12.1.11存储类别和函数389
12.1.12存储类别的选择389
12.2随机数函数和静态变量390
12.3掷骰子393
12.4分配内存:malloc()和free()396
12.4.1free()的重要性399
12.4.2calloc()函数400
12.4.3动态内存分配和变长数组400
12.4.4存储类别和动态内存分配401
12.5ANSIC类型限定符402
12.5.1const类型限定符403
12.5.2volatile类型限定符404
12.5.3restrict类型限定符405
12.5.4_Atomic类型限定符(C11)406
12.5.5旧关键字的新位置406
12.6 关键概念407
12.7本章小结407
12.8复习题408
12.9编程练习409
第13章 文件输入/输出413
13.1与文件进行通信413
13.1.1文件是什么413
13.1.2文本模式和二进制模式413
13.1.3I/O的级别415
13.1.4标准文件415
13.2标准I/O415
13.2.1检查命令行参数416
13.2.2fopen()函数416
13.2.3getc()和putc()函数417
13.2.4文件结尾418
13.2.5fclose()函数419
13.2.6指向标准文件的指针419
13.3一个简单的文件压缩程序419
13.4文件I/O:fprintf()、fscanf()、fgets()和fputs()421
13.4.1fprintf()和fscanf()函数421
13.4.2fgets()和fputs()函数422
13.5随机访问:fseek()和ftell()423
13.5.1fseek()和ftell()的工作原理424
13.5.2二进制模式和文本模式425
13.5.3可移植性425
13.5.4fgetpos()和fsetpos()函数426
13.6标准I/O的机理426
13.7其他标准I/O函数427
13.7.1intungetc(intc,FILE*fp)函数427
13.7.2intfflush()函数428
13.7.3intsetvbuf()函数428
13.7.4二进制I/O:fread()和fwrite()428
13.7.5size_tfwrite()函数429
13.7.6size_tfread()函数430
13.7.7intfeof(FILE*fp)和intferror(FILE*fp)函数430
13.7.8一个程序示例430
13.7.9用二进制I/O进行随机访问433
13.8关键概念435
13.9本章小结435
13.10复习题435
13.11编程练习437
第14章 结构和其他数据形式439
14.1示例问题:创建图书目录439
14.2建立结构声明441
14.3定义结构变量441
14.3.1初始化结构442
14.3.2访问结构成员443
14.3.3结构的初始化器443
14.4结构数组444
14.4.1声明结构数组446
14.4.2标识结构数组的成员447
14.4.3程序讨论447
14.5嵌套结构448
14.6指向结构的指针449
14.6.1声明和初始化结构指针450
14.6.2用指针访问成员451
14.7向函数传递结构的信息451
14.7.1传递结构成员451
14.7.2传递结构的地址452
14.7.3传递结构453
14.7.4其他结构特性454
14.7.5结构和结构指针的选择458
14.7.6结构中的字符数组和字符指针458
14.7.7结构、指针和malloc()459
14.7.8复合字面量和结构(C99)462
14.7.9伸缩型数组成员(C99)463
14.7.10匿名结构(C11)465
14.7.11使用结构数组的函数466
14.8把结构内容保存到文件中467
14.8.1保存结构的程序示例468
14.8.2程序要点470
14.9链式结构471
14.10联合简介472
14.10.1使用联合472
14.10.2匿名联合(C11)473
14.11枚举类型474
14.11.1enum常量475
14.11.2默认值475
14.11.3赋值475
14.11.4enum的用法476
14.11.5共享名称空间477
14.12typedef简介478
14.13其他复杂的声明479
14.14函数和指针481
14.15关键概念487
14.16本章小结487
14.17复习题488
14.18编程练习490
第15章 位操作493
15.1二进制数、位和字节493
15.1.1二进制整数494
15.1.2有符号整数494
15.1.3二进制浮点数495
15.2其他进制数495
15.2.1八进制495
15.2.2十六进制496
15.3C按位运算符496
15.3.1按位逻辑运算符497
15.3.2用法:掩码498
15.3.3用法:打开位(设置位)498
15.3.4用法:关闭位(清空位)499
15.3.5用法:切换位499
15.3.6用法:检查位的值500
15.3.7移位运算符500
15.3.8编程示例501
15.3.9另一个例子503
15.4位字段505
15.4.1位字段示例506
15.4.2位字段和按位运算符509
15.5对齐特性(C11)515
15.6关键概念516
15.7本章小结516
15.8复习题517
15.9编程练习518
第16章 C预处理器和C库521
16.1翻译程序的第一步521
16.2明示常量:#define522
16.2.1记号525
16.2.2重定义常量525
16.3在#define中使用参数525
16.3.1用宏参数创建字符串:#运算符527
16.3.2预处理器黏合剂:##运算符528
16.3.3变参宏:...和__VA_ARGS__529
16.4宏和函数的选择530
16.5文件包含:#include531
16.5.1头文件示例531
16.5.2使用头文件533
16.6其他指令534
16.6.1#undef指令534
16.6.2从C预处理器角度看已定义534
16.6.3条件编译535
16.6.4预定义宏539
16.6.5#line和#error540
16.6.6#pragma540
16.6.7泛型选择(C11)541
16.7内联函数(C99)542
16.8_Noreturn函数(C11)544
16.9C库544
16.9.1访问C库544
16.9.2使用库描述545
16.10数学库546
16.10.1三角问题547
16.10.2类型变体548
16.10.3tgmath.h库(C99)550
16.11通用工具库550
16.11.1exit()和atexit()函数550
16.11.2qsort()函数552
16.12断言库556
16.12.1assert的用法556
16.12.2_Static_assert(C11)557
16.13string.h库中的memcpy()和memmove()558
16.14可变参数:stdarg.h560
16.15关键概念562
16.16本章小结562
16.17复习题562
16.18编程练习563
第17章 高级数据表示567
17.1研究数据表示567
17.2从数组到链表570
17.2.1使用链表572
17.2.2反思576
17.3抽象数据类型(ADT)576
17.3.1建立抽象577
17.3.2建立接口578
17.3.3使用接口581
17.3.4实现接口583
17.4队列ADT589
17.4.1定义队列抽象数据类型590
17.4.2定义一个接口590
17.4.3实现接口数据表示591
17.4.4测试队列598
17.5用队列进行模拟600
17.6链表和数组605
17.7二叉查找树608
17.7.1二叉树ADT608
17.7.2二叉查找树接口609
17.7.3二叉树的实现611
17.7.4使用二叉树624
17.7.5树的思想628
17.8其他说明629
17.9关键概念630
17.10本章小结630
17.11复习题630
17.12编程练习631
附录A 复习题答案633
附录B 参考资料665
B.1参考资料I:补充阅读665
B.2参考资料II:C运算符667
B.3参考资料III:基本类型和存储类别671
B.4参考资料IV:表达式、语句和程序流675
B.5参考资料V:新增C99和C11的ANSIC库679
B.6参考资料VI:扩展的整数类型714
B.7参考资料VII:扩展字符支持716
B.8参考资料VIII:C99/C11数值计算增强720
B.9参考资料IX:C和C++的区别726

其他推荐