描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787512429307
本书借助生活概念帮助用户理解编程,巧妙安排知识交叉,让读者不受限于常见的控制台下编程,快速感受C 编程的乐趣,提升学习动力。本书适合作为零基础C 编程学习从入门到深造的课程教材。本书也是《白话C 之练武》的学习基础。“练武”的重点内容有:标准库(STL)、准标库(boost)、图形界面库编程(wxWidgets)、数据库编程、缓存系统编程、网络库编程和多媒体游戏编程等。
1.1开始1
1.2什么是计算机4
1.2.1“冯·诺依曼”版4
1.2.2“白话 C ”版5
1.3什么是硬件、软件6
1.4什么是程序7
1.4.1什么是指令7
1.4.2指令兼容8
1.4.3程序=指令的逻辑组合8
1.4.4程序vs软件9
1.5什么是编程语言9
1.5.1机器语言10
1.5.2机器语言的“字母”10
1.5.3二进制(基础)11
1.5.4汇编语言11
1.5.5高级语言12
1.5.6编程思维13
1.5.7从C到C 14
1.6什么是IDE15
1.7你是程序员17
1.8出发赠言19
第2章准备20
2.1基础知识20
2.1.1开源协议20
2.1.2“库”是什么20
2.1.3“库”长什么样子21
2.1.4学习哪些“库”22
2.1.5准备安装目录22
2.1.6更多支持22
2.2安装IDE——Code::Blocks23
2.2.1检查MinGW环境23
2.2.2安装Code::Blocks23
2.2.3升级Code::Blocks24
2.2.4安装MinGWw6424
2.2.5试运行25
2.2.6配置IDE26
2.3系统编译环境变量29
2.4安装wxWidgets30
2.4.1下载31
2.4.2编译31
2.4.3检查32
2.5安装boost33
2.5.1下载33
2.5.2辅助工具34
2.5.3编译34
2.5.4检查35
2.6安装MySQL35
2.6.1搞清楚“位数”36
2.6.2安装MySQL37
2.6.3安装MySQL管理客户端38
2.6.4安装MySQL 32位C语言客户端库39
2.7安装MySQL 39
2.7.1辅助工具39
2.7.2下载39
2.7.3编译39
2.7.4安装40
2.8配置Code::Blocks全局变量41
2.8.1新建全局变量集:d2school42
2.8.2全局路径变量wx42
2.8.3全局路径变量boost43
2.8.4全局路径变量mysql44
2.8.5全局路径变量mysqlpp44
第3章感受(一)45
3.1Hello
world经典版45
3.1.1向导控制台项目45
3.1.2初识代码47
3.1.3头文件48
3.1.4标准输出cout50
3.1.5名字空间51
3.1.6函数52
3.1.7主函数54
3.1.8注释55
3.2Hello
world中文版56
3.2.1“字符集”和“编码”56
3.2.2问题与解决56
3.3Hello
world函数版58
3.3.1定义函数58
3.3.2调用函数58
3.3.3重复调用59
3.3.4带参函数59
3.4Hello
world交互版61
3.4.1变量61
3.4.2常量63
3.4.3数据类型63
3.4.4定义变量64
3.4.5完成交互64
3.5Hello
world分支版65
3.5.1流程控制ifelse66
3.5.2修改Hello函数——区别对待66
3.5.3多级ifelse67
3.5.4常见关系、逻辑操作符67
3.6Hello
world循环版68
3.6.1流程控制while68
3.6.2修改main函数——反复操作69
3.7Hello
Object生死版70
3.7.1定义对象类型71
3.7.2创建对象72
3.7.3构造函数73
3.7.4析构函数74
3.7.5对象生命周期74
3.7.6对象与内存78
3.7.7对象可见区域80
3.8Hello
Object成员版81
3.8.1成员数据84
3.8.2成员函数85
3.9Hello
Object派生版86
3.9.1使用分支86
3.9.2为何派生87
3.9.3如何派生88
3.9.4定义“美人类”88
3.9.5使用“美人类”89
3.9.6变和不变89
3.9.7派生类的生死过程90
3.10Hello
Object多态版92
3.10.1虚函数93
3.10.2虚“析构函数”95
3.10.3应用虚函数96
3.10.4多态vs.非多态99
3.11Hello
Object封装版99
3.11.1什么是封装99
3.11.2类型即封装101
3.11.3公开、保护、私有102
3.11.4class
vs struct104
3.11.5封装应用示例105
3.11.6常量成员函数109
3.12Hello
STL向量篇110
3.12.1基础111
3.12.2常用接口112
3.12.3遍历113
3.12.4实例:选美大赛管理系统115
3.13Hello
STL链表篇123
3.13.1基础124
3.13.2迭代器/iterator概念124
3.13.3常用函数1126
3.13.4常用函数2128
3.13.5常量迭代器130
3.13.6遍历list容器131
3.13.7实例:成绩管理系统1132
3.14Hello
STL算法篇137
3.14.1函数对象139
3.14.2自定义查找算法141
3.14.3泛化查找算法143
3.14.4标准库查找算法146
3.14.5标准库排序算法147
3.14.6实例:成绩管理系统2148
3.15Hello
STL文件篇160
3.15.1写文件161
3.15.2读文件163
3.15.3带格式读取164
3.15.4实例:成绩管理系统3165
第4章感受(二)170
4.1Hello
GUI基础篇170
4.1.1C::B文件默认编码170
4.1.2wxWidgets项目向导171
4.1.3界面设计172
4.1.4编译运行174
4.1.5发布程序174
4.2Hello
GUI布局篇175
4.2.1wxSmith基础175
4.2.2wxBoxSizer基础179
4.2.3布局修改实例180
4.2.4挂接事件183
4.3Hello
Internet184
4.3.1创建项目185
4.3.2界面设计185
4.3.3编写代码186
4.4Hello
Database188
4.4.1基本需求189
4.4.2准备数据189
4.4.3创建工程190
4.4.4编写代码192
第5章基础198
5.1从代码到程序198
5.1.1编译机制198
5.1.2解释机制200
5.1.3虚拟机机制201
5.2构建C 程序202
5.2.1预编译202
5.2.2编译205
5.2.3链接206
5.2.4手工构建208
5.3项目/Project209
5.3.1项目文件209
5.3.2源文件、头文件210
5.3.3使用头文件211
5.3.4库文件215
5.4进程与内存216
5.4.1什么叫进程217
5.4.2进程的内存空间217
5.4.3内存分配测试程序218
5.5内存分段220
5.5.1代码段221
5.5.2数据段和“全局数据”221
5.5.3栈内存223
5.5.4堆内存224
5.6CPU、寄存器225
5.7线程227
5.8数据与内存230
5.8.1地址、尺寸、值、类型230
5.8.2取址、取尺寸、取值、取类型233
5.8.3指针——装着地址的变量235
5.8.4堆数据与内存237
5.8.5数组数据239
5.8.6堆数组与内存240
5.8.7常量与内存245
5.8.8二维数组与内存247
5.8.9数组综合练习248
5.8.10声明、定义、实现251
5.9进制(一)258
5.9.1初识二进制258
5.9.2正整数和零259
5.9.3负整数(原码、反码、补码)259
5.9.4无符号数vs有符号数262
5.10进制(二)263
5.10.1十六进制263
5.10.2八进制265
5.10.3进制换算266
5.10.4浮点数267
第6章IDE——Code::Blocks271
6.1窗口布局271
6.1.1边栏271
6.1.2工具栏272
6.1.3布局保存273
6.2环境设置273
6.2.1常规设置/General Settings273
6.2.2视图/View274
6.2.3多页面板/Notebooks appearance274
6.2.4禁用的对话框/Disabled dialogs275
6.2.5内置游戏/C::B Games275
6.2.6自动保存/Autosave275
6.2.7环境变量/Environment variables276
6.2.8头文件自动引入/HeaderFixup configuration276
6.2.9帮助文件/Help files277
6.2.10待办事件/Todo list278
6.3编辑器设置279
6.3.1常规设置/General Settings279
6.3.2代码折叠/Folding282
6.3.3边界和光标符/Margins and caret282
6.3.4语法高亮/Syntax highlighting282
6.3.5简写词/Abbreviations282
6.3.6代码格式化工具/Source formatter283
6.3.7代码完成/Code completion284
6.3.8快捷键/Keyboard shortcuts284
6.3.9拼写检查/Spell Checker287
6.3.10wxSmith配置287
6.4编译器全局设置287
6.4.1编译器选项/Compiler settings288
6.4.2其他设置/Other settings288
6.4.3构建配置/Build options288
6.5调试器全局设置288
6.6全局路径变量289
6.7项目管理290
6.7.1项目组织290
6.7.2项目向导292
6.7.3项目文件293
6.8项目构建选项294
6.8.1公共配置和目标配置294
6.8.2项目编译器设置/Compiler Settings295
6.8.3项目链接器设置/Linker settings296
6.8.4项目搜索路径/Search directories298
6.8.5项目构建附加步骤/Prepost build steps300
6.8.6项目定制变量/Custom variables300
6.9项目属性300
6.9.1项目设置/Project settings300
6.9.2构建目标/Build targets301
6.10项目实践303
6.10.1构建动态库303
6.10.2构建静态库304
6.10.3主项目可执行程序305
6.10.4配置依赖库305
6.10.5设置项目间依赖关系306
6.11调试307
6.11.1启动调试307
6.11.2设置断点308
6.11.3单步运行309
6.11.4观察数据309
6.11.5单步进入310
6.11.6单步跳出311
6.11.7其他步进指令311
6.11.8定位错误311
6.11.9中止调试312
第7章语言313
7.1字面量313
7.1.1整数字面量314
7.1.2浮点数字面量315
7.1.3空指针字面量315
7.1.4布尔值字面量316
7.1.5字符字面量317
7.1.6字符串字面量322
7.1.7枚举字面量323
7.1.8宏替换325
7.1.9自定义字面量326
7.2类型327
7.2.1基本概念327
7.2.2整型329
7.2.3浮点型330
7.2.4字符类型331
7.2.5布尔类型332
7.2.6空类型333
7.2.7类/结构334
7.2.8枚举类型338
7.2.9类型别名344
7.3类型基础行为345
7.3.1定义345
7.3.2初始化行为348
7.3.3初始化类成员356
7.3.4复制构造行为361
7.3.5赋值行为366
7.3.6转换行为371
7.3.7转移行为380
7.3.8析构行为384
7.4变量和常量385
7.4.1变或不变385
7.4.2常量成员数据386
7.4.3常量成员函数387
7.5引用388
7.5.1定义引用390
7.5.2常量引用392
7.5.3引用传递393
7.5.4右值引用395
7.6指针401
7.6.1定义指针401
7.6.2初始化指针401
7.6.3取值与成员访问403
7.6.4释放指针404
7.6.5常量指针406
7.6.6指针的指针408
7.7数组409
7.7.1初始化数组410
7.7.2常量数组410
7.7.3数组间复制数据411
7.7.4数组退化411
7.7.5字符数组和字符串413
7.7.6多维数组415
7.7.7指针和数组417
7.7.8数组类型的别名420
7.8STL常用类型420
7.8.1std::string/wstring422
7.8.2std::list424
7.8.3std::vector426
7.8.4std::array430
7.8.5std::map433
7.8.6std::ofstream437
7.8.7std::ifstream439
7.8.8std::stringstream441
7.8.9智能指针442
7.9生存期、作用域、可见性、访问限定451
7.9.1基本概念451
7.9.2声明453
7.9.3名字空间455
7.9.4类型定义作用域469
7.10函数477
7.10.1函数作用域477
7.10.2自由函数、成员函数478
7.10.3函数声明与定义478
7.10.4函数入参479
7.10.5函数返回值489
7.10.6函数静态数据503
7.10.7递归调用504
7.10.8函数重载505
7.10.9操作符重载509
7.10.10内联函数512
7.10.11主函数514
7.10.12函数指针515
7.11Lambda函数519
7.11.1基本概念519
7.11.2入参与返回522
7.11.3捕获/capture523
7.12操作符与表达式527
7.12.1算术操作528
7.12.2基础操作529
7.12.3关系操作530
7.12.4逻辑操作531
7.12.5位操作533
7.12.6自运算536
7.12.7逗号操作符538
7.12.8取址、取值539
7.12.9成员访问540
7.12.10指针偏移计算540
7.12.11数组运算543
7.13语句与流程544
7.13.1简单语句544
7.13.2复合语句544
7.13.3if545
7.13.4switch549
7.13.5while553
7.13.6dowhile556
7.13.7for562
7.13.8break/continue567
7.13.9goto569
7.13.10综合练习570
7.14模板580
7.14.1基本概念580
7.14.2函数模板581
7.14.3显式指定模板参数582
7.14.4函数模板示例583
7.14.5类模板585
7.14.6成员函数模板587
7.14.7标准库函数模板示例588
7.14.8模板代码编译591
7.15异常593
7.15.1斧头帮的异常594
7.15.2错误VS异常594
7.15.3基本语法599
7.15.4示例:斧头帮行动异常版601
7.15.5异常再抛出603
7.15.6捕获任意类型异常606
7.15.7函数异常规格607
7.15.8函数自我捕获异常608
7.15.9构建异常“家族”610
7.15.10标准库异常类613
7.16并行流程615
7.16.1多线程615
7.16.2线程同步互斥体619
7.16.3规避死锁622
7.16.4使用守护锁623
7.16.5实例:并行累加5千万个数624
第8章面向对象634
8.1抽象634
8.1.1概念635
8.1.2难点637
8.1.3要素639
8.2封装643
8.2.1不变式645
8.2.2原则647
8.2.3“不变式”实例649
8.2.4从关系到状态655
8.2.5类型即封装656
8.2.6类型默认行为658
8.2.7this指针660
8.2.8访问控制664
8.2.9冗余保护664
8.2.10构造与资源初始化666
8.2.11析构与资源释放673
8.2.12复制行为定制675
8.2.13特定行为定制680
8.2.14定制类型转换686
8.2.15转移操作689
8.2.16静态成员689
8.2.17常量成员693
8.2.18嵌套类694
8.2.19友元696
8.2.20回归C的封装702
8.2.21进阶思考709
8.3派生735
8.3.1语法基础738
8.3.2受保护的741
8.3.3派生方式744
8.3.4派生类的构造746
8.3.5派生类的析构750
8.3.6多重派生751
8.3.7派生类与作用域755
8.4基于对象例程759
8.4.1INI文件简介760
8.4.2面向过程的设计761
8.4.3基于对象的设计767
8.4.4复用实现的派生775
8.5多态779
8.5.1“什么”和“为什么”779
8.5.2接口约定782
8.5.3虚函数785
8.5.4“多态”实例786
8.6OO设计原则792
8.6.1isa关系792
8.6.2抽象、抽象、再抽象795
8.6.3高内聚低耦合797
8.6.4明确数据边界800
8.6.5强化数据不变性803
8.6.6层次与模块808
8.6.7框架型基类809
8.7综合练习815
8.7.1工资发放练习815
8.7.2射击游戏的需求815
8.7.3小小进销存的需求817
第9章泛型820
9.1泛型概念820
9.2基础回顾820
9.2.1函数模板820
9.2.2类模板822
9.2.3成员函数模板823
9.3模板实例化825
9.3.1只帮一次忙825
9.3.2潜在匹配条件828
9.3.3显式指定类型829
9.3.4类模板实例化831
9.3.5模板内符号身份确定832
9.3.6非类型模板参数835
9.3.7模板参数默认值838
9.4泛型应用实例838
9.4.1CStyle类型转换模板838
9.4.2Pair839
9.4.3AutoPtr842
9.4.4RangeArray849
9.4.5链表结构856
9.5泛型特化872
9.5.1函数模板特化872
9.5.2类模板特化基础876
9.5.3局部特化的花样878
9.5.4全特化880
参考文献881
2000年的时候我开始写《白话C 》。那时候流行个人主页,就在搜狐网站上申请了一个域名:mywlbcyl,取“没有弯路,编程摇篮”的拼音首字母,主要发表自己写的C 入门课程。
然后,就走了10多年的弯路,当年要有摇篮里的宝宝跟我学C ,现在都该读大学了。现实比这更残酷,跟着我的课程学习的人,当年多数是风华正茂的小鲜肉,现在都成大叔了。就说和我签订出书合同的胡编辑,转眼成了两个娃的爹。
可我的书还一直在“摇篮”里。
所以我肯定是一个“拖延症”加“完美臆想症”的严重综合患者,但我还是想找客观原因:C 的教程真的好难写,特别是结合我的想法和目标时。
(二)
十几年写一本书,要说是好事也可以。比如这十几年来,无论是C 还是我,都成熟了好多。
先说C 。新标准的制定与出台,各家编译器的进化,越来越多的开源C 项目、基于C 新标准的优秀书籍的出现,都是C 长足发展的标志。还有一点,那就是人,当然我想特指中国人,前面提到的标准、编译器的实现、开源项目等,都有越来越多的中国C 程序员参与其中。从人的因素出发很容易又能发现:C 编程的氛围也在变好。想当年有一个奇怪的氛围:说到C 就是VC,说VC就是MFC。2000年前后我曾在某论坛上发表了有关MFC设计不足之处的一些浅见,立刻淹没在一大波网友唾弃的口水中。现在,尽管C 早已不是编程语言上的“一哥”,但受益于多本经典C 书籍的流行,以及发达的网络和时间的沉淀,甚至也受益于更多其他编程语言的流行,使用者对这门语言的认识越趋成熟了(相信对其他语言也是)。
再说说我的成长。从二十多岁到四十多岁;从写几万行C 代码到几十万行代码;从只玩C/C 到在工作中用PHP、Java、C#、Delphi和Python,还学习了D语言、Go语言和JavaScript(Node)等;从嵌入式工控程序到Office桌面软件;从C/S结构到B/S结构,甚至偶尔充当“全栈工程师”。大约就是,周一写JavaScript HTML CSS,周二写后台分布式服务,周三改数据库结构,周四换了一套相对整洁的衣服去拜访客户、讲PPT,周五人事和我说:“帮忙面试个人吧?”周末?就像今天一样,白天补觉,晚上改《白话C 》书稿。
东忙西忙的日子里,我偶尔也回想起大学毕业刚走上社会的那几年,觉得自己懂人生、懂社会、也懂编程,现在才发现这三样我哪样都没能参透。所以我觉得自己应该是成熟了一些,并且觉得幸亏因为拖延症或者就是懒惰,没有在10年或更早前写完本书。《白话C 》的目的是帮助他人学习C ,而那时我对目标中的“帮助”“他人”“学习”和“C ”的理解都流于浅显粗鄙,这样子写出来的书对读者真有帮助吗?
(三)
十数年过去了,中间有近一年的时间,我安排自己到培训机构兼职教C 编程,非常辛苦也没什么钱可赚。学习上,我自己买的以C 为主的编程书籍近百本,阅读网络下载几十个开源C/C 项目源代码;实践上,我在许多软件项目中掉进去、爬出来的坑,大大小小感觉像是青春期永不消停的痘,有一天突然全被填平了。不管怎样,根据一项技能你学习5000(或者更多点,8000)小时就能成为业界专家的“定律”,我觉得自己对程序员、对编程技术以及程序员怎么学习和应用编程技术的认识,都上了新的台阶。我慢慢地将这些认识写进这本书里,一稿、二稿、三稿不断兴奋地写下,又不断沮丧地推翻;大家百度“白话C ”,应该可以找到数个版本。
在反复改写的过程中,最重要的一个认识是:学习C 应该既练功又练武。没错,我把学习C 语言分成“练功”和“练武”两件事。
习武之人说的“武功”,“功”通常是身体素质、内气外力;而“武”是“招式”(可以外延到“十八般武艺”)。关于这二者,有句老话叫“练武不练功,到老一场空”,意思是光练把式,不练气力,就容易止于花拳绣腿,一生难成高手。但在另外一个方向上,我记得霍元甲在创建迷踪拳时曾经说(电视里的):“练功不练武,都是白辛苦。”说的是另一个极端:你苦练内功,马步一扎特别稳实,却什么拳法招式都不练,什么兵器也不学,就会变成空有一身力气使不出来,白辛苦。转了个笑话加深大家对这种尴尬局面的理解,说是一个练“铁布衫”的和一个练“金钟罩”的比武,两人都一动不动地呈现“入定”状态,裁判在边上哭着说,“你俩扛得住,我扛不住啊!”
那么编程行业中,什么是“功”呢?广义上讲,计算机原理、网络协议、算法、语言语法、编译原理、设计模式都可以归为“功”。而类似“如何创建一个窗口”“如何提交一个网页的表单”“网页局部刷新的AJAX技术怎么用”“某某语言解析XML用哪个类”“怎么实现JSON和对象的互换”“如何访问MySQL数据库”“如何在数据链路上加入缓存”“哪家的短信服务器好用又便宜”“安卓系统如何实现消息推送”以及“Linux下的进程挂掉时怎么快速重启”等这些问题的答案,统统是“武”。
再进一步限定范围到“编程新人如何学习C ”,我将“功”限定在C 语言语法和编程范式(面向过程、基于对象、面向对象、泛型编程)等基础知识上,但凡对C 有一定了解的人,都清楚这已经可以写成厚厚的一本书了。以语言为主要教学内容的《C
Primer》或《C 程序设计语言》的厚度便是佐证。“武”的方面则挑选来自标准库STL及“准标准库”boost中的常用工具,桌面GUI编程、并发编程、数据库(MySQL)访问、缓存(Redis)访问、网络编程以及仅限于自娱自乐的简单多媒体游戏编程等。
“武”强“功”弱的C 工程师,通常解决实际问题的能力还不弱。项目要用到网络,就找个网络框架照着搭起来;项目要用到视频处理就找些视频代码改改用。C 语言的特点是一方面很复杂很庞大,一方面只需学习一小部分(比如“带类的C语言”)就可以写程序,甚至可以“一招鲜、走遍天”。这就造成部分人在学习阶段就急于动手出成绩甚至上岗赚钱。如此情况下,当他们面对复杂问题时,往往采用堆砌代码等方式完成,一个人做到底看似很快,想要在团队分工中让别人看懂他的代码就很困难了。并且所写的代码往往缺少合理的设计,在需求变化几次之后,整个代码就膨胀得像生气的河豚。
再说说那些“练功不练武,都是白辛苦”的同学。C 语言还有个特点,就是它的标准库仅为有高度共性、高度抽象的逻辑提供功能,许多实际项目经常用到的业务功能统统没有。想象丁小明(本书中的重要人物)捧了一本厚厚的C 书籍辛苦学了一年,上班时才发现老板是这么要求的:“听说QQ是C 写的,你来写个类似的窗口。”“听说C 写的程序性能好,你写个网络服务端,要求不高,1秒钟撑1万次访问就好。”“听说游戏引擎基本是C 写的,你开发个万人在线游戏吧。”“听说Photoshop也是C 写的,你写个程序批量美化下公司年会上的照片吧。”难吗?不好说,只是丁小明清楚地记得学习所用的那本C 书籍快1 000页了,但从头到尾没出现过网络、窗口创建、游戏和图片处理等。丁小明很郁闷。
本书是《白话C 》上册,重点负责“功”的部分。讲C 基本语法也讲二进制,讲编程环境如何搭建也讲“面向过程”“基于过程”和“面向对象”等编程范式,等等。下册负责“武”,讲解如何用C 写窗口图形界面程序、多线程并发程序、网络通信程序、数据库程序和小游戏程序等具体技能。
(四)
关于如何学习C ,我的第二个认识是:你没办法学一遍就能精通C 。事实上学习再多遍恐怕也精通不了,但请相信:刚开始学习时,通读一遍,练习一遍,再回头重新学习一遍,会比一节节死抠过去,结果一年时间未能读完一册的效果要好。C 中有许多知识点是交叉的,比如“指针”和“数组”,指针可以指向数组,数组的元素可以是指针,数组作为函数入参时会退化成指针。因此二者谁放前谁放后都有合理之处,学习完前面的有利于学习后面的,但学习了后面的同样有利于进一步理解前面的。拉长镜头看《白话C 》,许多篇章之间,甚至跨越上下册之间,都存在后面内容对前面内容进行验证或补充的安排。另一方面,许多复杂的知识,在靠前的章节就简略提及,这是刻意地对知识点做交叉学习的安排。最典型的如下册中的许多内容,在上册一开始就会有“不求甚解”的快速涉猎,让学习者感受C 的“能量”,避免一直埋头在黑乎乎的控制台窗口,误以为自己只能用C 写一些“玩具”代码。
以30天背30个英语单词为例,若一天就背30个,连续背30天;其效果通常要比第一天背第1个,第二天背第2个,一直背到第30个要好。机械记忆尚且如此,更何况是充满有机关联的编程语言呢?
作为一个极端的反例,学习编程语言一定不要过早追求100%精确,更不要沉迷于当“语言律师”。网上流传一个小视频,说是一位幼儿园老师想教会小朋友关于“小鸟听到枪声会受惊吓飞走”的知识,于是设计了一个问题:“树上停着七只鸟,猎人打了一枪后,树上剩下几只鸟?”没想到所有小朋友都很冷静,第一个问:“有没有耳聋的鸟?”第二个问:“有没有胆子大、神经大条的鸟?”第三个问:“有没有哪只鸟和死去的那只鸟的感情深厚,坚决要留下殉情的?”好嘛,为了回答老师那个看似简单的问题,这一下涉及到生理、心理和鸟类感情等方方面面的知识,这样的教学还如何进行呢?
《白话C 》第一章为读者圈出学习的最低起点,书的课程以该起点逐步推演。因此,许多知识点会反复出现,而且在不同的出现阶段会有不同的解释。靠后的解释相对全面、规范、简洁、深刻;靠前的解释就难免片面、粗浅、啰嗦甚至牵强——很可能低于您已有的水平,此时请各位一笑而过。
当然,以上有关“不求甚解”的说法,并非鼓励大家蜻蜓点水、囫囵吞枣般地学习。正确的方法应当是:遇上问题,加以思考;一时思考不出答案,应善于上网搜索;勤于编写程序测试或验证结果以及与人交流请教;如果还是不能解疑,也没必要卡在原地,可以做上标记,继续往下学习。
(五)
书中除了普通正文之外,还设置了“课堂作业”“小提示”“重要”“危险”和“轻松一刻”等小段落。各自的作用和学习的要点如下:
“课程作业”:一定要“现场”做,所谓“现场”就是不往后看新内容,立马做。出于排版需求,有一些作业并未单独成段,而是直接写在普通段落中。另外,更为重要的是,只要课程中出现示例代码,基本上要求读者亲自动手写程序并编译、测试通过。
“小提示”:和当前课程内容有一定的相关性,用于辅助解释当前课程的部分内容。碰上时能看懂最好,但如果个别无法理解也不用放在心上,通常并不影响继续阅读后文。
“重要”:长远看都是重要的知识点,虽然现在一时读不懂不会影响继续学习,但长远看会影响关键知识的运用。因此应努力阅读,如果不懂应做标记,以期下一次阅读能理解、掌握。
“危险”:如果现在搞不懂,很可能往下(特别是需要写代码时)没多长时间就要出问题的知识点。
“轻松一刻”:主要用于调节学习氛围,让大家偶尔放松,但也存在部分内容同时发挥“小提示”的作用,可当成相对有趣的“小提示”来看。当然出于行文的需要,也有大量轻松一刻的内容会以更加一本正经的方式躲在正文中。
(六)
希望《白话C 》能帮到正在或正要学习C 的广大读者。感谢购买本书。限于个人能力,加上篇幅大,前后反复修改大,请读者多提宝贵意见,以期持续改进。
感谢一直信任我,也一直在为本书努力的编辑。
感谢我的父母。未能在我的父亲离世之前完稿,是我今生至憾。感谢我的妻女,是你们一直在鞭策和鼓励我。我一直以为《白话C 》会是我的二女儿,可是书还没面市,家里二宝出生了,都上幼儿园了,这书要屈居老三。
帮助我完成本书的还有我的同事、朋友、同行、老师以及学生,一并感谢。以下是致谢名单:涂祺招、刘弘钊、胡海、王嫣琪、卢淼先、吴宸勖、颜闽辉、肖华、林起柄、揭英杰、陈婷婷、张晓晓、陈晓锋、白伟能、林柏年、卢毅、杨文、罗海翔、庄渊、赖锦波、潘代淦。
请在北京航空航天大学出版社官网的“下载专区”或者在第2学堂网下载本书源码。
评论
还没有评论。