新書推薦:
《
经纬度丛书·州县之民:治乱之间的小民命运
》
售價:HK$
96.8
《
女性史:古代卷(真正意义上的女性大历史)
》
售價:HK$
123.2
《
你当我好骗吗?
》
售價:HK$
120.9
《
跨代伴侣治疗
》
售價:HK$
96.8
《
精华类化妆品配方与制备手册
》
售價:HK$
217.8
《
经纬度丛书:出祁山:诸葛亮北伐得与失
》
售價:HK$
96.8
《
心理治疗中的真意:心理治疗师的心灵之旅
》
售價:HK$
96.8
《
心理咨询与治疗技术经典入门(第3版)
》
售價:HK$
142.9
|
編輯推薦: |
C语言基础知识 面向对象编程、命名空间、容器、迭代器、类、模板与泛型等。
C语言高级知识 智能指针、并发与多线程等。
C语言扩展知识 有关内存的高级话题、认识STL标准模板库等。
C11新标准 可调用对象、*引用、函数模板类型推断、引用折叠、完美转发、auto推断、decltype、lambda表达式、初始化列表、类型萃取等。
环境标准
本书基于C11新标准编写,书中全部实例通过 Visual Studio 2019编译环境调试。
本书看点:
实战经验总结 24年实际开发经验总结,CC技术精华荟萃。
知识覆盖全面 理论内容细致入微,全面覆盖CC基本知识。
讲解方法科学 叙述时演示与调试并重,变量与内存一起分析。
难点千锤百炼 理论结合实践,编程举例恰如其分,通俗易懂。
|
內容簡介: |
本书是一部CC编程语言书,定位在CC语言本身的讲解上面。本书包含纸质图书以及教学源代码文件。 本书共分为3部分。第1部分为CC语言概述第1章,主要介绍了C和C语言的起源,市场需求、就业形势及如何搭建语言开发环境等内容。第2部分为C语言(第2~12章),主要介绍C语言的各种开发知识,包括基础知识,如常量、变量、表达式、程序结构、数组、函数等,也包括高级知识,如指针、结构、位运算、文件等,本部分的学习是为后面的学习打基础。第3部分为C语言(第13~20章),主要介绍C语言的各种开发知识,包括基础知识,如面向对象编程、命名空间、容器、迭代器,也包括类的详细介绍、模板与泛型的详细介绍; 高级知识,如智能指针详细介绍、并发与多线程详细介绍; 扩展知识,如内存高级话题、STL标准模板库大局观; C11新标准,如可调用对象、*引用、函数模板类型推断、引用折叠、完美转发、auto推断、decltype、lambda表达式、初始化列表、类型萃取等。 本书以择业为导向,涵盖90%的CC语言常用开发知识,通俗易懂,范例众多,对于希望从事CC开发的读者极具实用价值,本书是一本不可多得的、值得珍藏并能够陪伴读者数年甚至数十年的参考书。 本书主要适合以下几类读者: (1) CC语言初学者或者由其他计算机语言转到CC语言的程序员。 (2) 从事CC开发多年的程序员,希望能够详细地复习一下基础的CC知识,把整个知识线串一串,形成一个比较完整的学习体系。 (3) 已经掌握C98标准,但是需要进一步学习C111417新标准的程序员。
|
關於作者: |
王健伟 男,1976年9月生,网名狂想(KuangXiang),1995年毕业于哈尔滨工程大学计算机及应用专业,拥有20多年软件开发经验,参与开发过数十个实际项目,涉及网络通信、网络安全、网络游戏等领域,具备极其深厚的软件开发实战经验。曾参与创办深圳知名网络安全公司安络科技有限公司,是中国首套网络安全在线扫描评估系统项目负责人、全球同服独立游戏《冒险之路》制作人。
|
目錄:
|
第1部分CC语言概述
第1章CC语言
1.1C和C语言的起源、特点、关系与讲解范畴
1.2CC语言的市场需求与就业需求分析
1.3再谈CC就业
1.4搭建语言开发环境
第2部分C语言
第2章数据类型、运算符与表达式
2.1常量、变量、整型、实型和字符型
2.1.1如何创建最基本的能运行的C程序
2.1.2C语言的数据类型
2.1.3常量和变量
2.1.4整型数据
2.1.5实型数据
2.1.6字符型数据
2.1.7字符串变量
2.1.8变量赋初值
2.1.9数值型数据之间的混合运算
2.2算术运算符和表达式
2.2.1C语言的运算符
2.2.2算术运算符和算术表达式
2.2.3运算符优先级问题
2.2.4强制类型转换运算符
2.2.5自增和自减运算符
2.3赋值运算符和逗号运算符
2.3.1赋值运算符和赋值表达式
2.3.2逗号运算符和逗号表达式
第3章程序的基本结构和语句
3.1C语言的语句和程序的基本结构
3.1.1语句的分类
3.1.2程序的三种基本结构
3.1.3赋值语句的特殊写法
3.2数据的输出与数据的输入
3.2.1数据的输出
3.2.2数据的输入
第4章逻辑运算和判断选择
4.1关系运算符、关系表达式与逻辑运算符、逻辑表达式
4.1.1关系运算符和关系表达式
4.1.2逻辑运算符和逻辑表达式
4.2if语句详解
4.2.1if语句的三种形式
4.2.2if语句的嵌套
4.3条件运算符和switch语句
4.3.1条件运算符
4.3.2switch语句
第5章循环控制
5.1循环控制语句简介与goto、while、dowhile语句精解
5.1.1循环控制语句简介
5.1.2goto语句
5.1.3while语句
5.1.4dowhile语句
5.2for语句精解
5.2.1for语句的一般形式
5.2.2for语句的主要说明
5.3循环的嵌套、比较与break语句、continue语句
5.3.1循环的嵌套
5.3.2几种循环语句的比较
5.3.3break语句和continue语句
第6章数组
6.1一维数组
6.1.1一维数组的一般形式
6.1.2一维数组元素的引用
6.1.3一维数组的初始化
6.2二维数组
6.2.1二维数组的一般形式
6.2.2二维数组元素的引用
6.2.3二维数组的初始化
6.3字符数组
6.3.1字符数组的定义
6.3.2字符数组的初始化
6.3.3字符串和字符串结束标记
6.3.4字符数组的输入输出
6.3.5字符串处理函数
第7章函数
7.1函数的基本概念和定义
7.1.1函数的基本概念
7.1.2函数的定义和返回值
7.2函数调用方式和嵌套调用
7.2.1函数调用的一般形式
7.2.2函数调用的方式
7.2.3函数的嵌套调用
7.3函数递归调用精彩演绎
7.3.1函数递归调用的定义
7.3.2递归调用的出口
7.3.3递归的优缺点及是否必须用递归
7.3.4递归的实际运用简介
7.4数组作为函数参数
7.4.1数组元素作为函数实参
7.4.2数组名作为函数实参
7.4.3用多维数组作为函数实参
7.5局部变量和全局变量
7.5.1局部变量
7.5.2全局变量
7.6变量的存储和引用与内部和外部函数
7.6.1变量的存储类别
7.6.2局部变量的存储方式
7.6.3全局变量跨文件引用
7.6.4函数的跨文件调用
7.6.5static关键字用法总结
第8章编译预处理
8.1宏定义
8.1.1不带参数的宏定义
8.1.2带参数的宏定义
8.2文件包含和条件编译
8.2.1文件包含
8.2.2条件编译
第9章指针
9.1指针的基本概念详解
9.1.1前提知识
9.1.2地址的概念
9.1.3直接访问和间接访问
9.2变量的指针和指向变量的指针变量
9.2.1指针变量的定义
9.2.2指针变量的引用
9.2.3指针变量作为函数参数
9.3数组的指针和指向数组的指针变量
9.3.1指向数组元素的指针变量的定义和赋值
9.3.2通过指针引用数组元素
9.3.3数组名作为函数参数
9.3.4回顾二维数组和多维数组的概念
9.3.5指向多维数组的指针和指针变量探究
9.3.6指针数组和数组指针
9.3.7多维数组的指针作为函数参数
9.4字符串的指针和指向字符串的指针变量
9.4.1字符串表示形式
9.4.2字符串指针作为函数参数
9.4.3字符指针变量与字符数组
9.5函数指针和返回指针值的函数
9.5.1用函数指针变量调用函数
9.5.2把指向函数的指针变量作为函数参数
9.5.3返回指针值的函数
9.6指针数组、指针的指针与main函数参数
9.6.1指针数组概念回顾
9.6.2指向指针的指针
9.6.3指针数组作为main函数参数
9.7本章小结
第10章结构体与共用体
10.1结构体变量定义、引用与初始化
10.1.1结构体简介
10.1.2定义结构体类型变量的方法
10.1.3结构体类型变量的引用
10.1.4结构体变量的初始化
10.2结构体数组与结构体指针
10.2.1结构体数组
10.2.2结构体指针
10.2.3用指向结构体的指针作为函数参数
10.3共用体、枚举类型与typedef
10.3.1共用体
10.3.2枚举类型
10.3.3用typedef定义类型
第11章位运算
11.1位的概念和位运算符简介
11.1.1位的概念
11.1.2位运算符简介
11.2位运算的具体应用
第12章文件
12.1文件简介及文本、二进制文件区别
12.1.1文件简介
12.1.2文本文件和二进制文件区别详细解释
12.2文件的打开、关闭、读写与实战操练
12.2.1文件的打开
12.2.2文件的关闭
12.2.3文件的读写
12.2.4文件读写实战操练
12.3将结构体写入二进制文件再读出
12.3.1将结构体写入二进制文件
12.3.2从二进制文件中读出结构体数据
12.3.3文件使用方式中"rb"和"r"、"wb"和"w"的区别
第3部分C语言
第13章C基本语言
13.1语言特性、工程构成与可移植性
13.1.1语言特性: 过程式、对象式程序设计
13.1.2C程序和项目文件构成谈
13.1.3编译型语言概念与可移植性问题
13.2命名空间简介与基本输入输出精解
13.2.1命名空间简介
13.2.2基本输入输出
13.3auto、头文件防卫、引用与常量
13.3.1局部变量和初始化
13.3.2auto关键字简介
13.3.3头文件防卫式声明
13.3.4引用
13.3.5常量
13.4范围for、new内存动态分配与nullptr
13.4.1范围for语句
13.4.2动态内存分配问题
13.4.3nullptr
13.5结构、权限修饰符与类简介
13.5.1结构回顾
13.5.2public和private权限修饰符
13.5.3类简介
13.5.4类的组织
13.6函数新特性、inline内联函数与const详解
13.6.1函数回顾与后置返回类型
13.6.2inline内联函数
13.6.3函数特殊写法总结
13.6.4const char *、char const *与char * const 三者的区别
13.6.5函数形参中带const
13.7string类型
13.7.1总述
13.7.2string类型简介
13.7.3定义和初始化string对象
13.7.4string对象上的常用操作
13.8vector类型
13.8.1vector类型简介
13.8.2定义和初始化vector对象
13.8.3vector对象上的操作
13.9迭代器精彩演绎、失效分析及弥补、实战
13.9.1迭代器简介
13.9.2容器的迭代器类型
13.9.3迭代器beginend、反向迭代器rbeginrend操作
13.9.4迭代器运算符
13.9.5const_iterator迭代器
13.9.6迭代器失效
13.9.7范例演示
13.10类型转换: static_cast、reinterpret_cast等
13.10.1隐式类型转换
13.10.2显式类型转换(强制类型转换)
13.10.3总结
第14章类
14.1成员函数、对象复制与私有成员
14.1.1总述
14.1.2类基础
14.1.3成员函数
14.1.4对象的复制
14.1.5私有成员
14.2构造函数详解、explicit与初始化列表
14.2.1称呼上的统一
14.2.2构造函数
14.2.3多个构造函数
14.2.4函数默认参数
14.2.5隐式转换和explicit
14.2.6构造函数初始化列表
14.3inline、const、mutable、this与static
14.3.1在类定义中实现成员函数inline
14.3.2成员函数末尾的const
14.3.3mutable
14.3.4返回自身对象的引用this
14.3.5static成员
14.4类内初始化、默认构造函数、=default;和=delete;
14.4.1类相关非成员函数
14.4.2类内初始值
14.4.3const成员变量的初始化
14.4.4默认构造函数
14.4.5=default;和=delete;
14.5拷贝构造函数
14.6重载运算符、拷贝赋值运算符与析构函数
14.6.1重载运算符
14.6.2拷贝赋值运算符(赋值运算符)
14.6.3析构函数(释放函数)
14.6.4几个话题
14.7子类、调用顺序、访问等级与函数遮蔽
14.7.1子类概念
14.7.2子类对象定义时调用构造函数的顺序
14.7.3访问等级(public、protected与private)
14.7.4函数遮蔽
14.8父类指针、虚纯虚函数、多态性与析构函数
14.8.1父类指针与子类指针
14.8.2虚函数
14.8.3多态性
14.8.4纯虚函数与抽象类
14.8.5父类的析构函数一般写成虚函数
14.9友元函数、友元类与友元成员函数
14.9.1友元函数
14.9.2友元类
14.9.3友元成员函数
14.10RTTI、dynamic_cast、typeid、typeinfo与虚函数表
14.10.1RTTI是什么
14.10.2dynamic_cast运算符
14.10.3typeid运算符
14.10.4type_info类
14.10.5RTTI与虚函数表
14.11基类与派生类关系的详细再探讨
14.11.1派生类对象模型简介
14.11.2派生类构造函数
14.11.3既当父类又当子类
14.11.4不想当基类的类
14.11.5静态类型与动态类型
14.11.6派生类向基类的隐式类型转换
14.11.7父类、子类之间的复制与赋值
14.12左值、右值、左值引用、右值引用与move
14.12.1左值和右值
14.12.2引用分类
14.12.3左值引用
14.12.4右值引用
14.12.5std::move函数
14.12.6左值、右值总结说明
14.13临时对象深入探讨、解析与提高性能手段
14.13.1临时对象的概念
14.13.2产生临时对象的情况和解决方案
14.14对象移动、移动构造函数与移动赋值运算符
14.14.1对象移动的概念
14.14.2移动构造函数和移动赋值运算符概念
14.14.3移动构造函数演示
14.14.4移动赋值运算符演示
14.14.5合成的移动操作
14.14.6总结
14.15继承的构造函数、多重继承、类型转换与虚继承
14.15.1继承的构造函数
14.15.2多重继承
14.15.3类型转换
14.15.4虚基类与虚继承(虚派生)
14.16类型转换构造函数、运算符与类成员指针
14.16.1类型转换构造函数
14.16.2类型转换运算符类型转换函数
14.16.3类型转换的二义性问题
14.16.4类成员函数指针
14.16.5类成员变量指针
第15章模板与泛型
15.1模板概念与函数模板的定义、调用
15.1.1模板概念
15.1.2函数模板的定义
15.1.3函数模板的调用
15.1.4非类型模板参数
15.2类模板概念与类模板的定义、使用
15.2.1类模板概念
15.2.2类模板的定义
15.2.3类模板的成员函数
15.2.4类模板名字的使用
15.2.5非类型模板参数的使用
15.3使用typename的场合、函数模板、默认模板参数与趣味写法分析
15.3.1typename的使用场合
15.3.2函数指针作为其他函数的参数
15.3.3函数模板趣味用法举例
15.3.4默认模板参数
15.4成员函数模板,模板显式实例化与声明
15.4.1普通类的成员函数模板
15.4.2类模板的成员函数模板
15.4.3模板显式实例化与声明
15.5using定义模板别名与显式指定模板参数
15.5.1using定义模板别名
15.5.2显式指定模板参数
15.6模板全特化与偏特化(局部特化)
15.6.1类模板特化
15.6.2函数模板特化
15.6.3模板特化版本放置位置建议
15.7可变参模板与模板模板参数
15.7.1可变参函数模板
15.7.2可变参类模板
15.7.3模板模板参数
第16章智能指针
16.1直接内存管理newdelete、创建新工程与观察内存泄漏
16.1.1直接内存管理newdelete
16.1.2创建新工程与观察内存泄漏
16.2newdelete探秘、智能指针总述与shared_ptr基础
16.2.1newdelete探秘
16.2.2智能指针总述
16.2.3shared_ptr基础
16.3shared_ptr常用操作、计数与自定义删除器等
16.3.1shared_ptr引用计数的增加和减少
16.3.2shared_ptr指针常用操作
16.4weak_ptr简介、weak_ptr常用操作与尺寸问题
16.4.1weak_ptr简介
16.4.2weak_ptr常用操作
16.4.3尺寸问题
16.5shared_ptr使用场景、陷阱、性能分析与使用建议
16.5.1std::shared_ptr使用场景
16.5.2std::shared_ptr使用陷阱分析
16.5.3性能说明
16.5.4补充说明和使用建议
16.6unique_ptr简介与常用操作
16.6.1unique_ptr简介
16.6.2unique_ptr常用操作
16.7返回unique_ptr、删除器与尺寸问题
16.7.1返回unique_ptr
16.7.2删除器
16.7.3尺寸问题
16.8智能指针总结
第17章并发与多线程
17.1基本概念和实现
17.1.1并发、进程、线程的基本概念和综述
17.1.2并发的实现方法
17.1.3C11新标准线程库
17.2线程启动、结束与创建线程写法
17.2.1范例演示线程运行的开始和结束
17.2.2其他创建线程的写法
17.3线程传参详解、detach坑与成员函数作为线程函数
17.3.1传递临时对象作为线程参数
17.3.2临时对象作为线程参数继续讲
17.3.3传递类对象与智能指针作为线程参数
17.3.4用成员函数作为线程入口函数
17.4创建多个线程、数据共享问题分析与案例代码
17.4.1创建和等待多个线程
17.4.2数据共享问题分析
17.4.3共享数据的保护实战范例
17.5互斥量的概念、用法、死锁演示与解决详解
17.5.1互斥量的基本概念
17.5.2互斥量的用法
17.5.3死锁
17.6unique_lock详解
17.6.1unique_lock取代lock_guard
17.6.2unique_lock的第二个参数
17.6.3unique_lock的成员函数
17.6.4unique_lock所有权的传递
17.7单例设计模式共享数据分析、解决与call_once
17.7.1设计模式简单谈
17.7.2单例设计模式
17.7.3单例设计模式共享数据问题分析、解决
17.7.4std::call_once
17.8condition_variable、wait、notify_one与notify_all
17.8.1条件变量std::condition_variable、wait与notify_one
17.8.2上述代码深入思考
17.8.3notify_all
17.9async、future、packaged_task与promise
17.9.1std::async和std::future创建后台任务并返回值
17.9.2std::packaged_task
17.9.3std::promise
17.9.4小结
17.10future其他成员函数、shared_future与atomic
17.10.1std::future的其他成员函数
17.10.2续谈std::async的不确定性问题
17.10.3std::shared_future
17.10.4原子操作std::atomic
17.11Windows临界区与其他各种mutex互斥量
17.11.1Windows临界区
17.11.2多次进入临界区试验
17.11.3自动析构技术
17.11.4recursive_mutex递归的独占互斥量
17.11.5带超时的互斥量std::timed_mutex和std::
recursive_timed_mutex
17.12补充知识、线程池浅谈、数量谈与总结
17.12.1知识点补充
17.12.2浅谈线程池
17.12.3线程创建数量谈
17.12.4C11多线程总结
第18章内存高级话题
18.1new、delete的进一步认识
18.1.1总述与回顾
18.1.2从new说起
18.2new内存分配细节探秘与重载类内operator new、delete
18.2.1new内存分配细节探秘
18.2.2重载类中的operator new和operator delete操作符
18.2.3重载类中的operator new[]和operator delete[]操作符
18.3内存池概念、代码实现和详细分析
18.3.1内存池的概念和实现原理简介
18.3.2针对一个类的内存池实现演示代码
18.3.3内存池代码后续说明
18.4嵌入式指针概念及范例、内存池改进版
18.4.1嵌入式指针
18.4.2内存池代码的改进
18.5重载全局newdelete、定位new及重载
18.5.1重载全局operator new和operator delete操作符
18.5.2定位new(placement new)
18.5.3多种版本的operator new重载
第19章STL标准模板库大局观
19.1STL总述、发展史、组成与数据结构谈
19.1.1几个概念与推荐书籍
19.1.2算法和数据结构谈
19.1.3STL发展史和各个版本
19.1.4标准库的使用说明
19.1.5STL的组成部分
19.2容器分类与array、vector容器精解
19.2.1容器的分类
19.2.2容器的说明和简单应用
19.3容器的说明和简单应用例续
19.3.1deque和stack
19.3.2queue
19.3.3list
19.3.4其他
19.4分配器简介、使用与工作原理说
19.4.1分配器简介
19.4.2分配器的使用
19.4.3其他的分配器与原理说
19.4.4自定义分配器
19.5迭代器的概念和分类
19.5.1迭代器基本概念
19.5.2迭代器的分类
19.6算法简介、内部处理与使用范例
19.6.1算法简介
19.6.2算法内部一些处理
19.6.3一些典型算法使用范例
19.7函数对象回顾、系统函数对象与范例
19.7.1函数对象仿函数回顾
19.7.2标准库中定义的函数对象
19.7.3标准库中定义的函数对象范例
19.8适配器概念、分类、范例与总结
19.8.1适配器基本概念
19.8.2容器适配器
19.8.3算法适配器
19.8.4迭代器适配器
19.8.5总结
第20章高级话题与新标准
20.1函数调用运算符与function类模板
20.1.1学习C的体会
20.1.2函数调用运算符
20.1.3不同调用对象的相同调用形式
20.1.4标准库function类型简介
20.1.5总结
20.2万能引用
20.2.1类型区别基本概念
20.2.2universal reference基本认识
20.2.3万能引用资格的剥夺与辨认
20.3理解函数模板类型推断与查看类型推断结果
20.3.1如何查看类型推断结果
20.3.2理解函数模板类型推断
20.4引用折叠、转发、完美转发与forward
20.4.1引用折叠规则
20.4.2转发与完美转发
20.4.3std::forward
20.4.4std::move和std::forward的区别
20.4.5再谈万能引用
20.5理解auto类型推断与auto应用场合
20.5.1auto类型常规推断
20.5.2auto类型针对数组和函数的推断
20.5.3auto类型std::initializer_list的特殊推断
20.5.4auto不适用场合举例
20.5.5auto适用场合举例
20.6详解decltype含义与decltype主要用途
20.6.1decltype含义和举例
20.6.2decltype主要用途
20.6.3总结
20.7可调用对象、std::function与std::bind
20.7.1可调用对象
20.7.2std::function可调用对象包装器
20.7.3std::bind绑定器
20.7.4总结
20.8lambda表达式与for_each、find_if简介
20.8.1用法简介
20.8.2捕获列表
20.8.3lambda表达式延迟调用易出错细节分析
20.8.4lambda表达式中的mutable
20.8.5lambda表达式的类型和存储
20.8.6lambda表达式再演示和优点总结
20.9lambda表达式捕获模式的陷阱分析和展示
20.9.1捕获列表中的&
20.9.2形参列表可以使用auto
20.9.3成员变量的捕获问题
20.9.4广义lambda捕获
20.9.5静态局部变量
20.10可变参数函数、initializer_list与省略号形参
20.10.1可变参数函数
20.10.2initializer_list(初始化列表)
20.10.3省略号形参
20.11萃取技术概念与范例等
20.11.1类型萃取简介
20.11.2类型萃取范例
20.11.3迭代器萃取简介
20.11.4总结
后记IT职业发展的未来之路
|
內容試閱:
|
恭喜你,在众多的计算机编程语言中,选择了CC语言,一门业界公认的功能强大、性能极优但学习难度大的计算机编程语言。选择这门编程语言学习的读者通常是勇气和智慧兼具的人; 能够把这门语言熟练掌握并灵活运用的人也通常是那些能够在编程道路上走得更扎实、更久远,基础和综合开发实力远超同龄者的人。
20多年前,从事IT行业的人还不多,当时优秀的程序员也比较少,学习编程知识的途径也非常匮乏。当今,浩如烟海的知识通过网络变得随手可得,人们不得不面对一个新问题: 学什么以及跟谁学。
在CC语言的学习中,经常有许多人手捧着一些国外大师级的人所写的权威书艰难地阅读甚至反复地阅读。
在笔者看来,这种书并不适合初学者。一本好的编程书应该把最常用、最有用的知识以最通俗的语言和讲解传授给读者,为读者节约大量的阅读时间,并使读者达到事半功倍的学习效果。
笔者认为本书就是能让读者用少的时间掌握多且有用知识的书,笔者利用自己20多年一线开发的实践经验,把自己认为有用、重要的知识,以通俗的语言讲授给读者,让读者在短的时间内达到好的学习效果。
面向的读者
笔者在24年一线C开发经验的基础之上,编写这本《C新经典》,前后累计耗费将近10个月时间,夜以继日地工作,终于让它出现在你的手里。这是一本越看越精彩的C书。
这是一本专门面向CC编程语言开发者的专业书籍,针对CC语言,以择业为导向,主要适合以下几类读者:
(1) CC语言初学者或者由其他计算机语言转到CC语言的程序员。
(2) 从事CC开发多年的程序员,希望详细地复习基础的CC知识,把整个知识线串一串,形成一个比较完整的学习体系。
(3) 已经掌握C98标准,但是需要进一步学习C111417新标准的程序员。总之,不管读者是否有很丰富的C编程经验,这本书都值得购买,当把这本书拿到手的时候,你就会知道,笔者没有言过其实。随着年龄的增加,人的记忆力会逐渐下降,任何人都不可能将书中的每个知识点全部记在脑海里,所以,没有比将一本适合自己的书放在身边,随时查阅更明智的选择了!
本书特色
(1) 本书分三部分: 第1部分是CC语言概述; 第2部分是C语言; 第3部分是C语言。
第2部分适合C语言初学者或是想往C方向转的程序员,这部分内容也是第3部分内容的基础,对于没有基础的读者,千万不可跳过这部分内容,笔者这里所讲解的每一个知识点在第3部分学习C时都有用。
(2) 本书覆盖面广,讲解细致入微。
(3) 讲解的手段非常全面: 演示、调试、加断点、看变量、看内存都用上了。
(4) 坑点会反复强调,理论与实战结合,举例恰到好处,通俗易懂。
C开发的经典书不少,并且绝大部分经典书都出自外国人之手。许多读者在阅读这些书时,都会遇到读一遍完全没有读懂,只有反复阅读多遍,才能理解书中之意的情形,尤其是C11新标准推出以来,增加太多新的晦涩的概念、术语和知识点,进一步加重了学习者的负担,甚至让很多学习者望而却步。
很多名气大的作者写的书让人非常难以读懂,是因为他们是在用专家思维写书,结果必然是难以让普通大众读懂。生活中这样的人有很多,例如他自己明白一些知识,但只要是讲给别人听,一定会把别人讲糊涂。所以,水平高、开发实力强并不代表能写出好书。当然,反过来说,如果水平很差,当然也不可能写出好书。
在笔者看来,一本能够称得上经典的好书应该是通俗易懂的,对于读者来讲,认真读一遍就应该能够读懂,而读多遍的目的应该是深入理解和加深印象。《C新经典》正是一本认真读一遍就能读懂的书,书中笔者利用数十年一线开发所积累的丰富经验,配以大量精准到位的演示范例,把难以理解的内容通俗易懂地讲述明白,让读者收获满满。可以毫不夸张地说,这本书完全能够让读者感觉相见恨晚。读懂本书并认真实践书中的范例,至少相当于为读者增加了5年以上C开发的功力,也就是说,至少为读者节省5年的学习时间。
笔者具有讲课天赋,笔者有信心让一个从未学过CC程序开发的读者通过本书的学习成为CC开发高手。所以,对于转行到CC语言开发程序的读者,完全不用担心看不懂本书。但是,对于学习知识这件事,笔者坚持认为: 扶上马,送一程,让读者具备扎实的基础以及自我学习的能力是非常重要的。因此,要走得远,飞得高,最终还是要靠自己经年累月的不断努力和磨炼。
翻看本书的目录,读者不难发现本书的优秀和全面。除了C基本理论知识,书中还详尽介绍了高级模板话题、智能指针、并发与多线程、内存高级话题、STL标准库,以及C11新标准中万能引用、类型推断、引用折叠、完美转发、萃取技术等,这些知识,是真正成长为C开发大师必知必会的知识。其实,书中很多内容的讲解已经超越了C基础语言本身,迈向了更高的层次,让读者不但扎实地掌握基础,更有认知的大幅度提升。同时,书中的每个范例,都经过了笔者的深思熟虑,都会演示不同的知识点,所以每一个范例都重要,都不可错过。
在成书的过程中,笔者参考了大量C经典著作并尽最大努力通过网络寻找一切对本书的写作有用的资料,尽量不遗漏任何重要的知识,笔者的心愿是通过自己的表达把这些知识更通俗地传授给读者,让读者只花费15甚至110的精力就能获得相同的知识,让读者能够凭借本书尽早地找到工作,获得一项谋生的本领。对于书中内容,笔者进行了大量资料的参考和整合,付出了数月的时间和极大的心血。在这里,笔者发自内心地感谢诸多CC前辈在这个行业中多年的耕耘及对知识的积累和传播的贡献。
CC语言博大精深,本书并不是CC语言语法大全,事实上,没有任何一本书可以事无巨细、面面俱到地把每个知识点都讲解到。同时,笔者是一个实用主义者,笔者认为,生命有限而学海无涯,相信对于绝大多数人,学习CC开发知识,目的是实实在在地赚钱养家,而不是为了搞学术研究。所以,虽然本书中知识覆盖面广,但绝对不是什么内容都往书中放。在CC庞大的知识体系中,相当一部分知识是很少用到的,花费大量篇幅去详细阐述无疑是事倍功半,这个时候,笔者丰富的一线开发经验就起到了极大的作用凭借多年的实战经验,帮助读者甄别最重要的知识,尽量避免让读者浪费大量时间去学习那些很不常用的知识,保证读者在最短的时间内大幅度地提升自身的实力。
本书已经把CC语言开发中最常用功能的90%都介绍了,能够满足绝大多数读者日常工作所需,如果偶尔有遗漏的地方,读者完全可以通过自学来弥补。笔者深信,把这么多年工作中的所思、所想、所积累的有用知识点汇集在一本书中,该书的质量将超越绝大多数市面上的CC类书。
关于习题集
本书范例众多,因此笔者认为并不需要专门的习题集,或者可以说,这些范例本身就是绝好的习题。虽然笔者认为做大量的习题对实际工作的帮助并不大,但如果读者特别在意学后做题以巩固所学,比如学习了构造函数的概念之后,笔者建议,通过搜索引擎搜索C构造函数 练习这种关键词,能够搜索到大量相关的习题,通过完成这些习题,就可以验证自己的学习成果。
同时,笔者要指出,这些习题的完成,一般来讲,只代表在CC语言使用层面达到了一定的熟练度,具体在实际工作岗位上如何应用这些知识解决问题还需要在工作中去感受和体会。解决实际问题这件事,读者不要把它想得很难,其实它可能非常简单,人们往往都会对自己不熟悉的事物产生一些本能的畏惧,直接面对它,这种畏惧感自然消失。
如果真要做题,笔者建议读者学会整本书后一起做,从而综合地验证自己的学习成果。
阅读进度
不排除有基础和学习速度特别快的读者可以很快把本书的内容阅读完毕并掌握得很好,但通常来讲,笔者建议采取如下的阅读进度:
整本书大概有120节(比如1.1标题算一节),笔者建议读者每周平均学习2节。整本书后半部分内容比前半部分内容学习难度更大、篇幅更多,所以后半部分每节的学习时间要多,但是平均下来,笔者认为每周学习2节还是能够做到的,这意味着整本书大概需要花费400多天的学习时间,如果加快学习进度,读者可以力争在1年之内将本书学完。
在学习过程中,强烈推荐读者跟着笔者一起实践书中的每个范例,验证范例的正确性,实践是深化知识的一个极其重要的过程,这样学习效果将比只用耳朵听和用眼睛看强出3~5倍,千万不要偷懒,既然决定走程序开发这条路,现在的勤奋就是为了让自己以后少一些被动。若干年后,笔者不希望看到当年称自己一声老师的读者顶着生活的压力,还在费尽心力地调试Bug。笔者自己的成长经验是: 尽心编程10年后,程序中出现Bug的概率就非常小了,当我达到15年编程经验,往20年跨越的时候,偶尔的小Bug基本都随时发现随时消灭,偶尔出现的问题可以立即解决。读者千万不要以为程序员写出Bug是家常便饭,更不要以改Bug为荣。
本书内容全是重点,建议读者将整本书仔细学完,一节都不要错过。通过这样仔细的学习,本书包含哪些内容,在读者心中就会有一个比较深刻的印象,此时,这本书就可以当作读者的贴身伙伴和工具书了忘记了哪个知识点,或者想使用哪些编程技巧,随时翻开书查阅。
知识点千万不要死记硬背,随着读者学习知识的增多,会面临着学过的知识很快忘记的情形,这很正常,所以在大多数情况下,我们的头脑里往往只记录一个知识点的大概思路和解决方法的索引(位置),需要解决类似问题的时候能找到这个索引,翻阅资料来解决就非常好。
请记住,一个高级程序员甚至架构师的能力体现不在于记住多少高级复杂的代码(在笔者看来,能记住的复杂代码越多,往往意味着当下真正所掌握到的知识还太少),而在于把控项目的综合能力、解决问题时能够把所有细节、意外全部想到的缜密逻辑思维,而且实际动起手时很少犯错。这些,才是一个程序员的大成智慧,才是需要数年乃至数十年才能练就的。
另外,对于一个高级程序员来讲,一个知识点不会时,可以绕道而行或者研究明白这个知识点再使用,但绝不要滥用、瞎用导致产生Bug或使自己掉坑里去而影响整个团队甚至公司的运作。
运行环境
本书的范例全部在Windows下的Visual Studio 2019集成开发环境中调试通过。之所以选择这个平台,是因为它对开发者相当友好,开发和调试程序特别方便,尤其对初学者,极大降低了学习难度。
书中也详细阐述了在Windows下安装Visual Studio 2019的过程。因为书中讲解的内容涉及C11及更新的C标准语法,所以如果是在Windows操作系统下进行程序开发,建议读者使用Visual Studio集成开发环境并保证版本不低于Visual Studio 2017。
对于在Linux下从事CC开发的读者,只要CC编译器支持C11及更新的C标准语法,就完全没有问题,因为本书针对的是CC语言,所以本书中99.9%的范例都可以跨操作系统平台运行。
资料获取
本书有完整的配套学习资料(源码),读者可以免费获取。获取方法如下。
(1) 查找并关注程序员速成微信公众号。
(2) 在微信公众号中,输入新经典三个字,就可以获取配套学习资料下载链接。
读者评论
笔者在出版本书之前,有数月的时间,通过网络推出课程以教授CC开发知识,课程推出之后,收到了太多好评。这里摘录一部分评论:
现在别人追剧,我就追王老师的课,确实高校一些老师讲的C跟王老师讲的根本不在一个水平线。
学历看学校,本领学王老师。
听王老师的课感觉自己智商变高了,原来自己看书看不懂的内容听王老师的课后发现自己能懂了。
从4月底无意中发现这门课程以来,历时半月,加上假期,终于把所有课程学完了,真正是欲罢不能,讲得实在是太棒了。条理清晰,例证丰富,最重要是把各种使用中将遇到的陷阱都讲得很到位。而且,本课程涵盖了C系列版本的主要知识点,帮我完整梳理了C的知识,真是感激不尽。最后一章的总结也非常精准到位,每一句都是金玉良言,饱含工作经验和人生体会。再次表示感谢,期待王老师的实战课程。谨祝王老师身体健康,工作顺利。
翔实、实用的举例,不多话,不废话。
非常好,老师绝对是经验丰富的大牛,讲课清楚并且逻辑强,王老师的课可以说是我听过的最好的C课程了。
目前看过的所有C课中,含金量最高的。相见恨晚,感谢老师。
C工作14年的老菜鸟来学艺,希望能得到质的飞跃!技术这东西不服牛人不行,有些地方自己自学不只是多走弯路的事儿,是根本入不了道。
感谢王老师,我之前买过其他C课程,但是深度和您的课程无法相比。相信您的课程能改变我的命运,非常感谢王老师。我要好好努力。
老师我现在看了你的部分课程,觉得你讲得很细很好,你会出一本书把你讲的内容写上去吗?很期待啊,看老师的课程的进展快多了,很感谢老师出那么好的课程,帮我省去不少时间。
老师的C讲得实在太好了,看了才体会到这是下了大功夫做的教程,比我之前看的教程高了一个档次。
我好喜欢老师讲的课啊,通俗易懂有意思,比教育强太多了。
老师,真的很喜欢您的课程,能再多出几期课程吗?我还会买的。
谢谢老师,说真的,老师讲得真好,19岁开始学编程,先专升本再考研,2018年毕业。老师,是C讲得很好的老师,尽管我学过十几种编程语言,但是跟着老师学,很轻松。老师讲得真棒。现在从事AI、图像处理的工作,公司用Python做的demo做好了,就是速度跟不上,看老师讲的C,有种想哭的感觉,为什么不是在几年前看到这个课程,现在早就稳稳地掌握C了,有点功利。感谢老师,分享自己的工作经验。
老师,你什么时候可以出一门有关C或C的数据结构和算法的课程呢? 很期待。自从听你的课! 就已经是你的铁杆粉丝了!
真的讲得很仔细,对于不喜欢看书的人来说,王老师的课是福利,两年前出这个课程,我看我会飘的。
老师,在我上大学的时候怎么没出这个课程呢?
通俗易懂,幽默风趣,讲课方式独具一格。
很赞,很多平时没有注意到的细节都讲到了。
跟着老师的讲课做完的笔记,就是活字典啊,哪里忘了搜哪里。
不愧是老司机,用通俗易懂的方式讲解每一个知识点,简直就是讲活了书本啊。
老师讲得非常好,都是干货,没有废话,逻辑清楚,而且一听就是肚子里有东西。边讲,边写代码,更有助于学生理解和吸收知识。
好的老师,万事俱备,剩下的就剩你自己学不学了。
老师的课是我见过的C讲得很好的,我非常开心也非常荣幸能买到老师的课程,等我学完老师所有课程后,如果老师不反对,我想拜老师为师,交学费给您,以后工作中有不懂的问题,多向您请教。
语言学习体会
学好一门计算机语言,有三个最关键的要素:
(1) 有一本能够领着大家入门的好书,好书应该是出自好老师之手,而一个具有丰富的实战经验和讲课天赋的好老师,一定能让大家不踩坑,不浪费时间,至少眼下不必去掌握各种额外知识,节约大量学习时间,大幅度地加快学习速度。
(2) 不停地努力是根本,也就是不断地学习,不断地实践,多看优秀的人写的代码,并且要自己多动手参与实际项目写大量代码。连续写10年代码,你的代码中就会很少出现Bug,连续开发项目15年,你大概就能掌握用最高的效率解决各种开发问题,连续开发20年基本就达到大神的级别了。大家可能觉得这个时间太长了,笔者其实蛮希望大家打破这个魔咒,用更短的时间进阶到大神级,有这个目标的同学就更要跟着笔者一起努力了。
(3) 举一反三,任何书都不可能面面俱到地讲解每一个细节,否则会浪费大家很多时间,因为绝大部分知识在实际工作中是用不到的,所以大家一定要积极自学,善用搜索引擎,就可以很轻松地掌握很多新知识。
致谢
二十多年前,笔者写过一本《Crystal Reports水晶报表设计与开发实务》,这本书的写作实在是太辛苦,每天大概要写到凌晨3点才能休息,熬了3个多月。书完成之后,整个人瘦了好几圈。
虽然书有一定的销量,但是跟付出感觉不成比例。所以,从那时候开始,笔者就暗下决心,从此以后再也不写书了。
人算不如天算,2018年下半年,笔者通过网络,逐步发布一些CC类网络课程,让人意外的是,这些课程获得了学员极好的口碑,大有超越市面绝大多数CC类课程之势,在这个时候,清华大学出版社电子信息教材事业部主任、首席策划盛东亮先生找到笔者,希望笔者能够写一本优质的CC类图书。
因为多年前出书的心理阴影,笔者当时本能地拒绝了,但在笔者的心里却从此埋下了写书的种子。
几个月之后,笔者终于想通了写CC类图书这件事,感觉有两点好处:
(1) 帮助更多的读者迈入CC之门,也是为社会尽一点自己的微薄之力,做一个对社会有用的人。
(2) 扩大自身的知名度,增加收入,毕竟笔者也需要养家,通过自己的劳动赚取收入,这是光荣的。
当笔者把出书的想法说给盛东亮先生听的时候,他非常高兴并与笔者做了深入的沟通,我们二人年纪相仿,聊得很投机,在写书这件事情上观点也非常一致希望这是一本高质量的、经典的C图书,是一本可以摆在书架上10年甚至20年的书,如果仅让读者选那么2~3本最好的C图书时,希望本书是其中之一。
在本书写作、出版的交流过程中,盛东亮先生给予了笔者相当多的支持与鼓励,甚至可以说,如果不是盛东亮先生当初的接洽和后续顺畅愉快的交流,如果不是许多实际的工作都能在最短的时间敲定并逐一落实,这本书也许根本不会出现在读者面前。所以,这份感谢,笔者要送给你盛东亮先生。
笔者另外一个要感谢的人是清华大学出版社的资深编辑钟志芳老师,在本书写作、出版的过程中,因笔者对出版社的体例格式比较陌生,对写书过程中许多书面用语把握得不够精准,在书稿中出现了不少的格式问题和用词问题,钟老师通过在文档中加入极细致的批注给予了相当专业的指导,即便苛刻的格式要求让笔者心生恐惧并多次抱怨,钟老师都能够宽容理解。所以,这份感谢,笔者要送给你钟志芳老师。
最后
本书后记IT职业发展的未来之路,有笔者已经过半的人生走过了24年开发之路后留下的一些人生感悟,强烈推荐读者率先阅读。
C知识体系庞杂,虽然笔者非常尽心尽力,但限于水平,书中疏漏在所难免,恳请各位读者不吝指教。
王健伟2020年5月
|
|