新書推薦:
《
中国近现代名家精品——项维仁:工笔侍女作品精选
》
售價:HK$
66.1
《
宋瑞驻村日记(2012-2022)
》
售價:HK$
115.6
《
汗青堂丛书138·帝国的切口:近代中国口岸的冲突与交流(1832-1914)
》
售價:HK$
127.4
《
人世事,几完缺 —— 啊,晚明
》
售價:HK$
115.6
《
樊树志作品:重写明晚史系列(全6册 崇祯传+江南市镇的早期城市化+明史十二讲+图文中国史+万历传+国史十六讲修订版)
》
售價:HK$
498.0
《
真谛全集(共6册)
》
售價:HK$
1156.4
《
敦煌通史:魏晋北朝卷
》
售價:HK$
162.3
《
唯美手编16:知性优雅的编织
》
售價:HK$
54.9
|
編輯推薦: |
本书以C标准为蓝本,从过程化编程的基本描述,到对象化编程的方法展开,乃至高级编程的实质揭示,形成一条自然流畅的主线,通俗易懂,形象风趣。
|
內容簡介: |
本书是改版教材。然而从指导思想、内容结构、写作特点等方面,都以全新的面貌呈现于读者。全书全部重新执笔,代码全部重写,涵盖了基本C编程方法的全部技术特征。 本书以C标准为蓝本,从过程化编程的基本描述,到对象化编程的方法展开,乃至高级编程的实质揭示,形成一条自然流畅的主线,通俗易懂,形象风趣。
|
關於作者: |
钱能,1961年2月出生,浙江工业大学教授,著有《c程序设计教程》和《c程序设计教程(第二版)》等。
|
目錄:
|
第一部分 基础编程
Part Ⅰ The Basic Programming
第1章 概述(Introduction) 2
1.1 程序设计语言(Programming Language) 2
1.2 C前史(The Prehistory of C) 4
1.3 C 6
1.3.1 褒贬C(Pass Judgement on C) 6
1.3.2 C继承者(Inheritor of C) 7
1.3.3 标准C(Standard C) 7
1.4 C编程流程(C Programming Flow) 8
1.4.1 编程过程(Programming Procedure) 8
1.4.2 最小样板程序(Minimum Sample Program) 9
1.4.3 编程风格(Programming Style) 10
1.5 程序与算法(Programs & Algorithms) 11
1.5.1 程序(Programs) 11
1.5.2 算法(Algorithms) 12
1.5.3 编程与结构(Programming & Structures) 13
1.6 过程化程序设计(Procedural Programming) 13
1.6.1 基于过程的程序设计(Procedure-Based Programming) 13
1.6.2 结构化程序设计(Structured Programming) 16
1.7 对象化程序设计(Objectified Programming) 18
1.7.1 基于对象的程序设计(Object-Based Programming) 18
1.7.2 面向对象的程序设计(Object-Oriented Programming) 20
1.8 目的归纳(Conclusion) 22
练习1(Exercises 1) 23
第2章 基本编程语句(Basic Programming Statements) 24
2.1 说明语句(Declarative Statements) 24
2.1.1 变量定义(Variable Definition) 25
2.1.2 函数声明和定义(Function Declaration & Definition) 26
2.1.3 初始化与赋值(Initializing & Assignment) 27
2.2 条件语句(Conditional Statements) 27
2.2.1 if语句(if Statement) 27
2.2.2 条件表达式(Conditional Expressions) 30
2.2.3 switch语句(switch Statement) 31
2.2.4 if或switch语句(if or switch Statement) 34
2.3 循环语句(Loop Statements) 35
2.3.1 for循环结构(for Loop Structure) 35
2.3.2 for循环(for Loop) 36
2.3.3 while循环(while Loop) 38
2.3.4 do-while循环(do-while Loop) 39
2.4 循环设计(Cycle Designs) 40
2.4.1 字符图形(Character Graphics) 40
2.4.2 素数判定(Prime Decision) 44
2.5 输入输出语句(IO Statements) 46
2.5.1 标准IO流(Standard IO Streams) 46
2.5.2 流状态(Stream States) 46
2.5.3 文件流(File Streams) 49
2.6 转移语句(Move Statements) 51
2.6.1 break语句(break Statement) 51
2.6.2 continue语句(continue Statement) 52
2.6.3 goto语句(goto Statement) 53
2.7 再做循环设计(More Cycle Designs) 55
2.7.1 逻辑判断(Logic Decision) 55
2.7.2 级数逼近(Progression Approximation) 58
2.8 目的归纳(Conclusion) 61
练习2(Exercises 2) 62
第3章 数据类型(Data Types) 65
3.1 整型(int Types) 66
3.1.1 二进制补码(Binary Complement) 66
3.1.2 整型数表示范围(int Range) 68
3.1.3 编译器与整型长度(Compiler & int Length) 69
3.1.4 整数字面值(Integer Literals) 70
3.1.5 整数算术运算(Integer Arithmetic Operations) 70
3.2 整数子类(int Subtypes) 71
3.2.1 字符型(char Type) 71
3.2.2 枚举型(enum Type) 72
3.2.3 布尔型(bool Type) 73
3.3 浮点型(float Type) 73
3.3.1 浮点数表示(Floating-Point Number Representation) 74
3.3.2 浮点型表示范围 Floating-PointType Ranges 77
3.4 C-串与string(C-strings & string) 78
3.4.1 C-串(C-strings) 78
3.4.2 字符指针与字符数组(char Pointers & char Arrays) 79
3.4.3 string 82
3.4.4 string与C-串的输入输出(string & C-string IO) 84
3.4.5 string流(string Streams) 85
3.5 数组(Arrays) 86
3.5.1 元素个数(Number of Elements) 86
3.5.2 初始化(Initialization) 87
3.5.3 默认值(Default Values) 89
3.5.4 二维数组(2-D Arrays) 90
3.6 向量(Vectors) 90
3.6.1 基本操作(Basic Operations) 90
3.6.2 添加元素(Adding Elements) 92
3.6.3 二维向量(2-D Vectors) 93
3.7 指针与引用(Pointers & References) 94
3.7.1 指针(Pointers) 95
3.7.2 指针的类型(Pointer Types) 96
3.7.3 指针运算(Pointer Operations) 98
3.7.4 指针限定(Pointer Restrictions) 99
3.7.5 引用(References) 101
3.8 目的归纳(Conclusion) 102
练习3(Exercises 3) 103
第4章 计算表达(Computation Expressing) 105
4.1 名词解释与操作符(Name Explanation & Operators) 105
4.1.1 名词解释(Some Name Explanations) 105
4.1.2 操作符汇总(Operators Summary) 107
4.1.3 操作符的说明(Operator Explanations) 108
4.2 算术运算问题(Arithmetic Problems) 109
4.2.1 周而复始的整数(int: Move in Cycles) 109
4.2.2 算法局限性(Algorithm Limitation) 110
4.2.3 中间结果溢出(Intermediate Result Overflow) 111
4.2.4 浮点数的比较(Floating-Point Number Comparison) 112
4.3 相容类型的转换(Cast Compatible Types) 113
4.3.1 隐式转换(Implicit Cast) 113
4.3.2 精度丢失(Lost Precision) 114
4.3.3 显式转换(Explicit Cast) 115
4.4 关系与逻辑操作(Relations & Logic Operations) 117
4.4.1 条件表达(Condition Expressing) 118
4.4.2 基本逻辑与短路求值(Basic Logic & Short-Circuit Evaluation) 120
4.4.3 逻辑推演(Logic Inference & Deduction) 121
4.5 位操作(Bit Operations) 122
4.5.1 位操作种类(The Kinds of Bit Operations) 122
4.5.2 位操作实例(Bit Operation Example) 123
4.6 增量操作(Increment Operations) 125
4.6.1 增量操作符(Increment Operators) 125
4.6.2 操作符识别(Operator Recognition) 126
4.6.3 指针的增量操作(Pointer Increment Operation) 127
4.7 表达式的副作用(Expressions Side Effects) 128
4.7.1 操作数求值顺序(Operands Evaluating Order) 128
4.7.2 编译器相关(Complier Correlated) 129
4.7.3 交换律失效(Commutation Law Invalidation) 130
4.7.4 括号失效(Bracket Invalidation) 130
4.7.5 消除副作用(Avoiding Side Effects) 131
4.8 目的归纳(Conclusion) 131
练习4(Exercises 4) 132
第二部分 过程化编程
Part Ⅱ The Procedural Programming
第5章 函数机制(Function Mechanism) 136
5.1 函数性质(Function Character) 137
5.1.1 函数的形态(The Function Forms) 137
5.1.2 函数黑盒(Function Blackbox) 138
5.1.3 传值参数(Value-Passed Parameters) 140
5.2 指针参数(Pointer Parameters) 141
5.2.1 指针和引用参数(Pointer & Reference Parameters) 141
5.2.2 函数的副作用(Functions Side Effect) 145
5.3 栈机制(The Stack Mechanism) 147
5.3.1 运行时内存布局(Runtime Memory Layout) 147
5.3.2 栈区(The Stack Area) 148
5.3.3 局部数据的不确定性(Uncertainty of Local Data) 151
5.3.4 指针作祟(The Menacing Pointers) 151
5.4 函数指针(Function Pointers) 153
5.4.1 指向函数的指针(Function Pointers) 153
5.4.2 函数指针参数(Function Pointer Parameters) 155
5.4.3 函数指针数组(Function Pointer Arrays) 156
5.4.4 简略函数指针表示(The Outline of Function Pointers) 158
5.4.5 函数指针的意义(The Sense of Function Pointers) 158
5.5 main函数参数(The mains Arguments) 159
5.5.1 命令行重定向(Redirecting Command Line) 159
5.5.2 使用main参数(Using Main Arguments) 161
5.6 递归函数(Recursive Functions) 164
5.6.1 递归本质(Essence of Recursions) 164
5.6.2 递归条件(Condition of Recursions) 165
5.6.3 消去递归(Removing Recursions) 166
5.6.4 递归评说(Comment on Recursions) 167
5.7 函数重载(Function Overloading) 167
5.7.1 重载概念(Concept of Function Overload) 167
5.7.2 重载函数匹配(Overloaded Function Call Matches) 170
5.7.3 重载技术(Function Overload Technology) 171
5.7.4 默认参数(Default Parameters) 171
5.7.5 默认参数规则(Default Parameter Rules) 172
5.7.6 无名参数(Nameless Parameters) 173
5.7.7 重载或参数默认(Overload or Parameter Default) 173
5.8 目的归纳(Conclusion) 175
练习5(Exercises 5) 176
第6章 性能(Performance) 179
6.1 内联函数(Inline Functions) 180
6.1.1 概念(Concept) 180
6.1.2 规则(Rules) 182
6.1.3 性能测试(Performance Testing) 183
6.2 数据结构(Data Structures) 184
6.2.1 STL中的容器(Containers in STL) 184
6.2.2 安排车厢顺序(Arrange the Order of Coach) 185
6.2.3 栈法(Stack Method) 186
6.2.4 向量法(Vector Method) 187
6.3 算法(Algorithms) 188
6.3.1 算法与性能(Algorithms & Performance) 188
6.3.2 Fibonacci数列算法分析(Fibs Algorithms Analyses) 189
6.3.3 选择算法(Selecting Algorithms) 191
6.3.4 超越数值范围的策略(Strategy that Exceeding Number Range) 193
6.4 数值计算(Numerical Computation) 194
6.4.1 求解积分问题(Solve the Integral Problems) 194
6.4.2 矩形法(Rectangle Method) 194
6.4.3 辛普生法(Simpson Method) 196
6.4.4 调用库函数(Calling for the Library Function) 198
6.5 标准C算法(Standard C Algorithms) 199
6.5.1 集合元素访问(Element Access of Set) 199
6.5.2 判断字串相等1(Determining the String is Equal 1) 199
6.5.3 判断字串相等2(Determining the String is Equal 2) 200
6.5.4 判断字串相等3(Determining the String is Equal 3) 201
6.5.5 剩余串排列1(Arranging Remaining String 1) 202
6.5.6 剩余串排列2(Arranging Remaining String 2) 203
6.6 动态内存(Dynamic Memory) 204
6.6.1 预留向量空间(Reserving Vector Space) 204
6.6.2 蛮做素数判断(Judging Prime Numbers Rudely) 205
6.6.3 空间换时间(Space for Time) 206
6.7 低级编程(Low-Level Programming) 208
6.7.1 C编程(C Programming) 208
6.7.2 低级筛法(Low-Grade Sieve) 209
6.7.3 筛法性能的比较(Comparison of Sieve Performance) 211
6.8 目的归纳(Conclusion) 213
练习6(Exercises 6) 214
第7章 程序结构(Program Structure) 219
7.1 函数组织(Function Organization) 220
7.1.1 程序构成(Program Composition) 220
7.1.2 程序文件拆分(Program File Split) 221
7.2 头文件(Header File) 222
7.2.1 原始头文件(Original Header File) 222
7.2.2 界面头文件(Interface Header File) 224
7.2.3 头文件的内容(Content of Header File) 225
7.3 全局数据(Global Data) 226
7.3.1 全局数据访问(Global Data Access) 226
7.3.2 消除全局数据(Eliminate Global Data) 228
7.3.3 一次定义原则(One-Definition Principle) 229
7.3.4 全局常量(Global Constant) 232
7.4 静态数据(Static Data) 234
7.4.1 静态全局数据(Static Global Data) 234
7.4.2 静态局部数据(Static Local Data) 236
7.5 作用域与生命期(Scopes & Lifetime) 237
7.5.1 作用域(Scopes) 237
7.5.2 生命期(Lifetime) 239
7.6 名空间(Namespace) 241
7.6.1 名空间的概念(the Concept of Namespace) 241
7.6.2 名空间的组织(Namespace Organization) 242
7.6.3 组织模块(Module Organization) 244
7.6.4 数据名冲突(Data Name Conflict) 247
7.6.5 名空间的用法(Namespace Usage) 248
7.7 预编译(Pre-Compilation) 249
7.7.1 #include指令(#include Directive) 250
7.7.2 条件编译指令(Conditional Compiling Directive) 250
7.7.3 头文件卫士(Header Guard) 251
7.7.4 #define指令(#define Directive) 252
7.8 目的归纳(Conclusion) 253
练习7(Exercises 7) 253
第三部分 面向对象编程技术
Part Ⅲ The Object-Oriented Programming
第8章 类(Classes) 258
8.1 从结构到类(From Structure to Class) 259
8.1.1 定义结构(Defining Structure) 259
8.1.2 定义类(Defining Class) 261
8.2 成员函数(Member Functions) 263
8.2.1 成员函数定义(Member Function Definition) 263
8.2.2 使用对象指针(Using Object Pointer) 265
8.2.3 常成员函数(Constant Member Functions) 266
8.2.4 重载成员函数(Overloading Member Functions) 267
8.3 操作符(Operators) 268
8.3.1 函数重载特征(Function Overloading Charcteristics) 268
8.3.2 性质(Characters) 270
8.3.3 值返回与引用返回(Returning Value or Reference) 271
8.3.4 增量操作符(Increment Operators) 272
8.3.5 成员操作符(Member Operators) 273
8.4 再论程序结构(Revisiting Program Structure) 275
8.4.1 访问控制(Access Controls) 275
8.4.2 类的程序结构(Class Program Structure) 277
8.4.3 类作用域(Class Scope) 278
8.5 屏蔽类的实现(Shielding Implementation of Class) 280
8.5.1 意义(Significance) 280
8.5.2 影响编程方法(Influence Programming Method) 283
8.5.3 影响语言设计(Affecting Language Designing) 283
8.6 静态成员(Static Members) 284
8.6.1 静态数据成员(Static Data Members) 284
8.6.2 静态成员函数(Static Member Functions) 286
8.7 友元(Friends) 287
8.7.1 频繁调用问题(Frequent Call Problems) 287
8.7.2 提高访问性能(Improving Access Performance) 290
8.7.3 其他特征(Other Features) 293
8.8 目的归纳(Conclusion) 294
练习8(Exercises 8) 295
第9章 对象生灭(Object Birth & Death) 299
9.1 构造函数设计(Constructor Design) 300
9.1.1 初始化要求(Initialization Requirement) 300
9.1.2 封装性要求(Encapsulation Requirement) 301
9.1.3 函数形式(Function Form) 301
9.1.4 无返回值(Non Return-Type) 302
9.1.5 set的缺憾(Shortcomings of set) 304
9.1.6 一次性对象(Only-One-Time Object) 306
9.2 构造函数的重载(Overloading of the Constructor) 306
9.2.1 重载构造函数(Overloaded Constructor) 306
9.2.2 无参构造函数(Non-Parameter Constructor) 309
9.3 类成员初始化(Class Member Initialization) 310
9.3.1 默认调用的无参构造函数(No-Argument Constructor Called by Default) 310
9.3.2 初始化的困惑(Initialization Confusion) 311
9.3.3 成员的初始化(Initializing Members) 313
9.4 构造顺序(Constructing Sequence) 314
9.4.1 局部对象(Local Objects) 314
9.4.2 全局对象(Global Objects) 315
9.4.3 成员对象(Member Objects) 317
9.4.4 构造位置(Constructing Location) 318
9.5 拷贝构造函数(Copy Constructor) 319
9.5.1 对象本体与实体(Object Realty & Entity) 319
9.5.2 默认拷贝构造函数(Default Copy Constructor) 321
9.5.3 自定义拷贝构造函数(Custom Copy Constructor) 322
9.6 析构函数(Destructors) 324
9.7 对象转型与赋值(Object Transformation & Assignment) 326
9.7.1 用于转型的构造函数(Constructor for Transformation) 326
9.7.2 对象赋值(Object Assignment) 327
9.8 目的归纳(Conclusion) 330
练习9(Exercises 9) 331
第10章 继承(Inheritance) 334
10.1 继承结构(Inheritance Structure) 335
10.1.1 类层次结构(Class Hierarchy) 335
10.1.2 派生类对象结构(Derived Object Structure) 336
10.2 访问父类成员(Access Parent Member) 337
10.2.1 继承父类成员(Inherit the Members of the Parent Class) 337
10.2.2 类内访问控制(In-Class Access Control) 339
10.3 派生类的构造(Constructing Derived Classes) 341
10.3.1 默认构造(Default Construction) 341
10.3.2 自定义构造(Custom Construction) 341
10.3.3 拷贝构造与赋值(Copy Construction & Assignment) 343
10.3.4 对象构造顺序(Object Construction Order) 344
10.4 继承方式(Inheritance Mode) 344
10.4.1 继承访问控制(Inherited Access Control) 344
10.4.2 调整访问控制(Adjusting Access Control) 347
10.5 继承与组合(Inheritance & Composition) 348
10.5.1 对象结构(Object Structure) 348
10.5.2 性质差异(Difference in Nature) 349
10.5.3 对象分析(Object Analysis) 349
10.5.4 继承设计(Inheritance Design) 351
10.5.5 组合设计(Composition Design) 352
10.6 多继承概念(Multi-Inheritance Concept) 354
10.6.1 多继承结构(Multi-Inheritance Structure) 354
10.6.2 基类成员名冲突(Base-Class Member Name Collision) 356
10.6.3 基类分解(Base-Class Decomposition) 356
10.7 多继承技术(Multi-Inheritance Technology) 358
10.7.1 虚拟继承(Virtual Inheritance) 358
10.7.2 多继承对象构造顺序(Multi-Inheritance Object Construction Order) 360
10.7.3 多继承评价(Multi-Inheritance Evaluation) 360
10.8 目的归纳(Conclusion) 360
练习10(Exercises 10) 361
第11章 基于对象编程(Object-Based Programming) 363
11.1 抽象编程(Abstract Programming) 364
11.1.1 行为抽象(Action Abstract) 364
11.1.2 数据抽象(Data Abstract) 365
11.1.3 数据结构(Data Structure) 366
11.2 编程质量(Programming Quality) 367
11.2.1 可读性(Readability) 367
11.2.2 易编程性(Programmability) 368
11.2.3 安全性(Security) 369
11.2.4 可维护性(Maintainability) 370
11.2.5 可扩充性(Extensibility) 370
11.2.6 效率(Efficiency) 370
11.3 分析Josephus问题(Analyze the Josephus Problem) 372
11.3.1 问题描述(Problem Description) 372
11.3.2 过程化分析(Process Analysis) 373
11.3.3 基于对象的分析(Object-Based Analysis) 374
11.4 基于过程的解决方案(Process-Based Solutions) 375
11.4.1 算法(The Algorithm) 375
11.4.2 算法解释(Algorithm Explanation) 376
11.4.3 算法实现(Algorithm Implementation) 377
11.5 基于对象的解决方案(Object-Based Solutions) 379
11.5.1 算法(The Algorithm) 379
11.5.2 算法解释(Algorithm Explanation) 381
11.5.3 算法实现(Algorithm Implementation) 382
11.5.4 程序解释(Program Explanation) 385
11.6 程序维护(Program Maintenance) 386
11.7 程序扩展(Program Extension) 388
11.8 目的归纳(Conclusion) 391
练习11(Exercises 11) 392
第四部分 高级编程
Part Ⅳ Advanced Programming
第12章 多态(Polymorphism) 396
12.1 继承召唤多态(Inheritance Call Polymorphism) 397
12.1.1 祖孙互易的说明(Explanation of Mutual Change Between Up & Down) 397
12.1.2 覆盖父类操作(Overlapping Superclass Operation) 398
12.1.3 同化效应(Assimilation Effect) 399
12.1.4 渴望多态(Desire Polymorphism) 400
12.2 抽象编程的困惑(The Confusion of Abstract Programming) 401
12.2.1 类型域方案(Type Domain Scheme) 401
12.2.2 破坏抽象编程(Destroy Abstract Programming) 403
12.2.3 渴望内在的多态(Yearning for Inner Polymorphism) 404
12.3 虚函数(Virtual Function) 404
12.3.1 多态条件(Polymorphism Condition) 404
12.3.2 虚函数机理(Virtual Function Mechanism) 406
12.3.3 面向对象的真意(Object-Oriented True Meaning) 406
12.3.4 虚函数的传播(Propagation Virtual Functions) 407
12.4 避免虚函数误用(Avoiding Misuse of Virtual Functions) 408
12.4.1 搞清重载与覆盖(Understanding Overload & Overlap) 408
12.4.2 虚函数按覆盖实现(Virtual Function Realized as Overlap) 409
12.4.3 基类指针访问子类成员(Accessing SubClasss Member Using BaseClass Pointer 411
12.4.4 返回类型的例外(Exception of Return Type) 412
12.4.5 若干限制(Some Restrictions) 413
12.5 精简共性的类(Streamline Common Classes) 414
12.5.1 孤立的类(Isolated Classes) 414
12.5.2 减少冗余代码(Reducing Redundant Code) 417
12.5.3 改变基类殃及子类(SubClass Suffered by Changing Base-Class) 420
12.6 多态编程(Polymorphic Programming) 420
12.6.1 共同基类方案(Common Base-Class Scheme) 420
12.6.2 自定义链表类(Custom Linked List Class) 425
12.6.3 表现多态(Performance Polymorphism) 426
12.7 类型转换(Type Conversions) 427
12.7.1 动态转型(dynamic_cast) 427
12.7.2 静态转型(static_cast) 429
12.7.3 常量转型(const_cast) 430
12.8 目的归纳(Conclusion) 431
练习12(Exercises 12) 432
第13章 抽象类(Abstract class) 434
13.1 抽象基类(Abstract Base-Class) 434
13.1.1 无意义的基类对象(Meaningless Base Objects) 434
13.1.2 纯虚函数(Pure Virtual Functions) 436
13.2 抽象类与具体类(Abstract & Concrete Classes) 437
13.3 深度隔离的界面(Deeply Isolated Interface) 439
13.3.1 日期的年月日版本(Year-Month-Day Version of the Date) 439
13.3.2 日期的天数版本(Day Version of the Date) 441
13.3.3 应用程序界面(Application Program Interface) 442
13.4 抽象类做界面(Abstract Class As Interface) 444
13.4.1 抽象基类方案(Abstract Base-Class Scheme) 445
13.4.2 抽象基类IDate(Abstract Base-Class IDate) 445
13.4.3 创建Date对象(Creating Date Objects) 446
13.4.4 子类Date(Subclass Date) 447
13.4.5 应用编程(Application Programming) 449
13.5 演绎概念设计(Deducting Concept Design) 450
13.5.1 面向对象的模块(Object-Oriented Module) 450
13.5.2 Sony类层次结构(Class Sony Hierarchy) 450
13.5.3 Sony类定义(Defining Class Sony) 452
13.5.4 CreateSony类层次结构(Class CreateSony Hierarchy) 456
13.5.5 CreateSony的子类定义(Defining CreateSonys Sybclass) 458
13.5.6 应用编程(Application Programming) 460
13.6 系统扩展(System Extension) 461
13.6.1 新添一个界面(Adding a New Interface) 462
13.6.2 新添一种技术(Adding a New Technology) 464
13.7 手柄(Handles) 465
13.7.1 对象指针问题(Object Pointer Problem) 465
13.7.2 对象指针的外套(Object Pointer Coat) 466
13.7.3 可用的手柄类(Available Handles) 468
13.8 目的归纳(Conclusion) 469
练习13(Exercises 13) 470
第14章 模板(Templates) 471
14.1 函数模板(Function Templates) 472
14.1.1 函数重载的困惑(Confusion of Function Overloading) 472
14.1.2 函数模板的定义(Defining Function Template) 473
14.1.3 函数模板的用法(Usage of Function Templates) 473
14.2 函数模板参数(Function Template Parameters) 475
14.2.1 苛刻的类型匹配(Harsh Type Match) 475
14.2.2 数据形参(Data Arguments) 476
14.2.3 常量引用型形参(const Reference Arguments) 477
14.2.4 引用型形参(Reference Arguments) 478
14.2.5 函数模板重载(Function Template Overloading) 478
14.3 类模板(Class Templates) 480
14.3.1 容器类的困惑(Confusion of Container Classes) 480
14.3.2 类模板的定义(Class Template Definition) 481
14.3.3 类模板的实现(Class Template Implementation) 482
14.3.4 模板类和类模板(Template Classes & Class Templates) 484
14.3.5 模板值参数(Template Value Parameters) 485
14.3.6 默认模板实参(Default Template Arguments) 485
14.4 实例化与定做(Instantiation & Specialization) 486
14.4.1 模板实例化(Template Instantiation) 486
14.4.2 定做(Specialization) 487
14.4.3 局部定做(Partial Specialization) 490
14.5 程序组织(Program Organization) 491
14.5.1 包含方式(Inclusion Method) 491
14.5.2 分离方式(Separation Method) 494
14.6 模板的多态(Template Polymorphism) 496
14.6.1 动多态与静多态(Dynamic & Static Polymorphism) 496
14.6.2 动多态编程(Dynamic Polymorphism Programming) 496
14.6.3 静多态编程(Static Polymorphism Programming) 499
14.6.4 动静多态的差异(Difference between Dynamic & Static Polymorphism) 500
14.7 高级编程(Advanced Programming) 501
14.7.1 动多态设计模式(Dynamic Polymorphism Design Patterns) 501
14.7.2 静多态设计模式(Static Polymorphism Design Patterns) 503
14.7.3 泛型编程(Generic Programming) 504
14.8 目的归纳(Conclusion) 506
练习14(Exercises 14) 507
|
內容試閱:
|
人工智能发展的大势
人工智能代表了人类科学发展的前沿领地,C与其关系密不可分,所以本教材系列的出版有人工智能发展背景的一席之地。
人工智能目前尚处初级阶段,但其研究所派生的应用已经硕果累累,正在快速地改变我们的生活。人工智能解读医学拍片的本领已经比医生高;查阅法律证据的能力也比律师强;飞机及航空管理正在被人工智能替代;车辆行驶人工智能系统比人的操纵更好; 搜索引擎中的人工智能可以分析照片,告诉你照片里面的故事。在线地图、数码相机、自动驾驶、无人超市、无人餐馆、无人银行等,今后甚至桩桩、件件、处处都可装智能芯片,从而纳入人工智能管理。
人工智能最关心的是人工自主意识,目前网络和计算机已经完成了知识的检索和存储,几大搜索引擎也完成了关键字-关联解释的功能和海量数据积累,大多数机器人厂商已经完成了反应机、自适应等高级功能,但却还没有能通过图灵测试的真正的人工自主意识。当然人类对自身意识的研究水平制约着人工智能的实现,人工智能的应用还可反哺于人类对自身意识的研究。
人工智能或许认为,神经网络系统只有复杂到一定程度,且在大尺度上的相似性保持高度一致,其个体自然产生的意识才会具备类似神经网络个体的认同和感知。但在技术上,意识只不过是人造神经网络中诸多需求反馈链交错所致。所以,人们通过研究人类神经网络的构成分布、互联网的社会化训练过程,自然产生个体意识。但实际上目前网上的软件自动机和各种设备产生的不知名网络现象,即所谓自主意识,因还无法被人工智能所感知,只被当作不知名故障进行修复处理,自当无解。
人工智能又或许认为,可以通过人工制造的智慧个体(机器人),在初期表现出类似创造者的行为和意识,再慢慢地进化。机器学习和深度学习被证明是个有效的手段,但受限于机器人硬件发展和大数据,前路漫漫。况且面临着神经反馈网络发展的实际问题,进化过程中的数据过载或饥荒会导致行为和意识的随时失却。
然而人类正在不依不饶地解决人工智能的关键问题:机器人的行动能力和对环境的视觉、听觉、触觉、嗅觉感知能力都在快速增强,智能推演之,则机器人就可自行获取运行的能源;软件自编程系统逐渐实现的自继承、自升级和自恢复,可以使机器人自我修复和完善;人类所掌握的全方位机器人设计、生产、测控在逐渐人工智能化,总有一天,机器人可以自行复制。
未来的人工智能发展速度将呈指数级攀升,将有越来越多的机器人通过图灵测试而具意识。一旦人工智能具有创造性思维,其发展将促进人类的巨大科学进步。显然,人工智能离不开计算,其需要远远大于现有的计算能力,除了期待量子计算机外,还需要有高可靠性的软件架构和高性能算法,这便需要千锤百炼的编程语言和纵横交错的软件工具。
C的发展与地位
C在1998年制定了一个里程碑式的C 98国际标准,确立了C语言的强势地位。之后,C标准每年修订,2011年制定的C11标准,使得C的强类型特征得到了充分的体现,模板编程规范渐趋成熟。C11标准再次深度影响了C编译器的变革,其发展无时无刻不在说明其语言的完美缔造。
C充分继承了C,保持了与硬件的亲和性,在此基础上,有机结合了诸多编程方法,兼容C的过程化编程框架,实现了面向对象的高效设计,又开辟了可自动生成的模板编程架构,在程序设计语言界绝无仅有。C是当前使用最广泛的软件工具之一,其实现技术含量最高,应用于最重要领域。C给我们搭建的软件架构,得以让人类展开多层次的人-人、人-机的互动设计,其正完美地表现出作为人类自然语言的化身角色。
从另一个角度来说,C编程本身就是在撰写一篇优美的诗文,叙述一个精彩的故事,谱写一首动听的曲子。随着韵律和情节的跌宕起伏,什么时候故事讲完了,代码也就收尾了。好文章语义清晰、简练生动、辞藻华美、引人入胜;好代码通俗易懂、结构清晰、层次分明、优化高效。因为C独具多种编程方法,包揽从算法优化的微观细节,到模板架构的宏观布局,因而其开拓了编程中更广泛的遐想与表达的空间,C编程充满美感。
微软操作系统及其架构,Apple的大部分底层软件,腾讯的QQ和微信,阿里云、百度云计算之底层架构,Google的Android底层架构,大部分数据库核心代码,几乎所有重要的系统,只要上规模,需要保证高可靠性,计较性能,无一不是用C工具搭建。
正因为C继承了C的衣钵,充分实现与系统硬件的无缝对接,追求高效率编程,才使得人工智能兴起的今天,大量涉及硬件相关的软件开发,C是首选;其在人工智能的软件架构中,核心的逻辑语义表达,不但描述能力无可挑剔,而且在性能和效率方面占尽了优势。
重量级IT企业在招聘大数据工程师时,机器人公司在招聘开发人员时,都把C编程作为必备能力。目前在中小学教学的信息学与程序设计课程开设中,C趋向于统一指定为高考入学备考科目。事实上,学好C,再自学其他编程语言就很容易,反之则不行。
编程语言的世界排名前四名已经长时间被Java、C、C、Python这4种语言所占据。Java因其应用面更广泛而持续居于榜首,但在人工智能领域,Python编程相比Java,或许更加清爽、整洁、漂亮,其跃居前四,又有后来居上之势。人工智能也带来了C的再次繁荣,从某种程度上说,Python编程只是在搭建软件的外包装,而C才是其核心。C与C在占据系统底层应用方面没有什么差距,但是在规模化编程、自动生成、实现系统架构方面,非C莫属。况且由于C源自C的特点,C编程往往又是在C平台中实现。追本溯源,C语言才是当今人工智能大发展上最重要的工具。
改版框架
本教材系列进化到第3版,是作者20多年C教学研究与实践的总结。改版之后,每本主教材的框架结构没有变,所以遵循原编排特点、内容特点、学习方式。但毕竟编程应用需求形势大变,C的地位攀升,急需权威的C教材主导C的编程教学,故而第3版各版本的名称拟定、排版、内容都做了较大更新。
教材注重能力培养的理念与架构,必然在课程教学中从事问题驱动的教学模式,重视实践环节的设计和辅导,故在附表中,一并提供课程教学的全程视频对应表。
第3版中各版本一律改用双色文字排版,代码以及关注文字用另一种颜色和底纹凸显,从根本上改变了排版式样,可读性得以显著提升。
第3版中各版本的内容在原书的基础上修改提升,涉及内涵深度、风格表现、描述侧重点等诸多不同。其版本名称见表1。
第3版的通用版:侧重C基础,主要从概念着手,介绍C编写程序的技法,强调编写正确的程序。学习之后,应当能了解C是怎么回事,能解决什么问题,能看懂C程序,了解C的诸多技术特征,能编制一些简单的C程序,能发现一些常规的C错误,了解不同的程序设计方法,对面向对象程序设计方法及其特征有一个基本的了解,具备进一步学习后续课程(如数据结构、算法分析与设计)的基础。
第3版的竞技版:侧重C分析设计技术,从实战训练着手,介绍C的各种编程策略与技术,引导对数学及算法学习的重视,强调编写高效的程序。学习之后,应当能掌握基本的问题分析方法,掌握解决问题的设计技术;了解编程过程中的许多难点,深切体会细节决定成败;能够学习且具备参加各个层次程序设计竞赛的能力;对C能解决什么问题的能力有全新的看法,进一步了解面向对象程序设计的方法;学会层次分析和功能拆解,具备独立设计一个规模较大的程序的能力;具备语言学习的独立能力。
第3版的专业版:一方面对竞技版的C分析设计技术从底层的内存布局、编译器类型识别、各项技术相互关联等进行深度解析;另一方面介绍C新标准及其新编译器所涉及的技术,以纵向视角来审视C的未来发展,更全面地了解C的实现技术,全面了解面向对象程序设计方法和技术,产生对高级模板编程的兴趣。虽然本版本未必能成为高校C课程学习的主流,但是将其作为参考,可以作为国外诸多C优秀教材之补充。
通用版、竞技版、专业版编纂目的不同,学习目标不同,但3个版本都出自同一起点Hello World。每个主教材版本独立成体系,保证概念的正确性和前后连贯性,而又相互补充,展示C不同的发展阶段,也展示不同的目标要求,满足了不同学习能力的读者的学习需要。对于没有编程基础的读者,则适合从基础型教材的学习开始,逐渐进入实战型教材的学习训练,而将拓展型教材作为研读或参考教材,去领略C前沿之精妙。
在上述3个版本主教材的基础上,所撰写的三大教材的统一的实验指导和习题解答,则适合作教辅资料。倘若没有基础版的学习,又无行家点拨,则后面的编程学习会具有一定的困难,这也是在教学过程中确实存在的问题。
第3版的教材与其他国内外教材最大的不同,是聚焦于培养读者的编程实战能力。C语法现象的学习或许并没有面面俱到,但是运用C的编程方法与技巧,实际地解决问题,却占有相当的篇幅。
本书的技术特点
从实战的角度来打造全书,这是本书最大的特点。
因为有通用版的支持,一些概念不再细化或重复,更重要的是,教学理念变了,认为编程需要一个能力培养占主导的学习氛围,能力、知识、素质培养本是三位一体,强调培养编程兴趣,通过参加有意义的编程活动来结合教学。全书通过实战化的实例教学、实战化的实验方式、实战化的考核及其编程竞赛活动三个环节来达到快速提升编程能力的目的。而面向对象程序设计部分的叙述,更注重以尽可能小的篇幅,滤清编程问题。
竞技版以32位编译器BCB 6.0和VC 6.0为代码测试依据,强调C 98标准,剔除非C痕迹,形成代码个性。竞技版在正确性的前提下,注重程序的高效性。专辟第6章讲程序性能问题。书中注重对问题求解的分析,分析方法涉及程序逻辑,性能优劣的讨论也占很大比重。分析过程也一样影响到实验指导中对问题的分析设计及代码解答。
竞技版从编程技巧的角度讨论了多种优化方法。例如,空间换时间,位操作代替逻辑运算,整数表达式作逻辑运算,逻辑值参加算术运算,内嵌函数,循环表达等。书中还对典型优化的问题展开系列的讨论。例如,基于不同数据规模的素数判断,斐波那契数列之动态求值,用环链表结构解决Josephus问题。代码优化充分挖掘了语言的内部特征,为算法优化打下了扎实的基础。
书中的章节编排,更注重实践的推进。例如,提前介绍文件操作,淡化输入输出流的面向对象特征等;因强调C标准,更因强化实战编程能力而规范代码。例如,强调自定义类型作为引用参数传递,拷贝构造函数的常量引用参数,精简的for循环描述,条件表达式对if条件判断语句的简化;许多概念厘清了内在的原因,例如,为什么要用破坏封装的友元的描述,异常机制与函数调用的差别描述。字串处理占到编程实践的相当比例,用string字串处理可以给编程带来更多安全和方便,书中将string串与C字串结合,充分权衡了运行性能与高效编程,实现了利益最大化。
竞技版致力于系统化阐述面向对象程序设计的三大概念封装、继承、多态,讲清面向对象的真意。开始使用类系(即类的家族)这个名词,让读者意识到,面向对象程序设计的核心即是围绕如何处理类族对象。专业版将沿用类系一词。
C从C而来,平添了面向对象程序设计方法,又提供了STL编程,简化了初学中的编程描述。然而应了解什么情况下用STL会高效,需要多大的努力才能用自己冗长的代码来媲美STL代码的性能。例如,用冒泡排序加条件判断来应对各种复杂的排序要求,总是战胜不了亲自配备比较函数的STL排序算法sort。因编译器仅支持C 98标准,故STL编程中的方便性还未充分体现,模板编程也只滤清了一些概念,无法充分实践用模板框架结构进行模板编程。
温馨致谢
世界真奇妙,人逢知天命之年,却还百般任性,人的劣性也由此爆发,各种不顺都来围剿,整天疲于应对琐事,因而我放弃了写书。不料,出版社的魏江江,一句希望,一句怂恿,把我封存在心的C情结给钓了出来。回想这改版啊,本来就是我的梦。终于2018年的9月,决定要做改版的事。
编辑王冰飞,诸多鼓励和建议,洋溢着热情与幽默,以及印象深刻的高效工作,让我感受到C教材撰写工作的崇高。教材的受益群体,从中小学生、大学生到程序员,都需要提升编程能力来强化自己的内涵和跟进现实世界,以致我认定了意义,直奔赶进度的节奏而去。
家人默默的生活支持,酿成了一种影响力,一句快写C的催促,将本不起眼的几个音节,窝成了一个大大的推波,汹涌地扑在我的心上。
诸多同事,C的OPS(Online Programming Space,在线编程天地)提交系统维护者刘端阳和陈波老师,还有与我抱团的张永良和王英姿老师,共同实施了C精品课程的编程能力训练。还有我的整个C教学团队,学院教学院长江颉老师从一开始就是C能力培养型教学的支持者,课程教学责任人龙胜春老师的虚心求教的启示及平时给予我很多的关照,毛国红老师对我的C程序设计试卷提出的精益求精的见解,等等,恕不一一列出。他们都是我教材撰写的促进者。
在我内心深处,还有一种更原始的动力,来自恩师王国东先生,他是我的人生导师,我能得以轻轻放下,又重拾信心,拣起改版一事;他更是我长此以往写C教材时的诸多灵感与智慧的源泉,系列成书,功不可没第一人。
钱能
于杭州自在居
2020年8月
|
|