描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302527435
尽量用浅显易懂的例子说明语法概念,力求简明扼要、避免空洞的概念和冗长的描述。
提供了游戏编程、信息管理、数据结构、机器学习、人工智能等不同领域的经典实战案例,帮助读者理解语法知识、提高学习兴趣。
标准库的输入输出流库、容器、迭代器、算法、智能指针等工具到异常处理和RAII等,由浅入深地对*的C 17标准语法进行了系统的讲解。对一些关键的语法概念如函数、类与对象、派生类等内容,提供了游戏编程、信息管理、数据结构、机器学习、人工智能等学科领域的一些经典的、实际问题的实战演练,以加强读者将语法知识用于解决各种实际问题和进行实际编程能力的训练,让读者领悟和体会C 语言的灵活运用。
本书描述精炼、简单易懂,并有丰富的实战案例,既适合作为编程初学者的学习用书,也适合有编程基础的开发人员迅速学习和掌握现代C 语言。
第1章 C 介绍
1.1程序与编程语言
1.1.1计算机是什么
1.1.2计算机编程
1.1.3编译器、解释器和C 语言
1.1.4C 语言介绍
1.1.5C 程序开发步骤
1.2C 程序结构
1.2.1最简单的C 程序
1.2.2函数
1.2.3语句
1.2.4程序注释
1.2.5hello world程序
1.2.6标准输入输出库和cout
1.2.7名字空间
1.2.8字符串和字符
1.2.9运算符和运算数
1.2.10宏定义#define
1.2.11变量
1.2.12标准输入流对象cin
1.2.13用户定义类型
1.3数和字符的表示
1.3.1数的表示
1.3.2字符的表示
1.4编译、执行C 程序
1.5习题
第2章变量和类型
2.1变量
2.1.1变量的定义及初始化
2.1.2auto
2.1.3typeid运算符
2.1.4decltype
2.1.5赋值运算符=
2.1.6const
2.1.7标识符、关键字、文字量
2.2数据类型
2.2.1基本类型
2.2.2sizeof运算符
2.2.3文字量
2.2.4格式化输出
2.2.5类型转换
2.2.6类型别名
2.2.7枚举
2.3局部变量与全局变量、变量的作用域与生命期
2.3.1程序块、局部变量和全局变量
2.3.2作用域和生命期
2.4习题
第3章运算符与表达式
3.1运算符
3.1.1运算符的分类
3.1.2优先级和结合性
3.2表达式
3.3算术运算符
3.3.1算术运算符需要注意的几个问题
3.3.2自增 和自减–
3.3.3数学计算函数库cmath
3.4位运算
3.5赋值运算符
3.6关系运算符
3.7逻辑运算符
3.8特殊运算符
3.8.1条件运算符
3.8.2逗号运算符
3.9习题
第4章语句
4.1简单语句、复合语句和控制语句
4.1.1简单语句
4.1.2复合语句
4.1.3控制语句
4.2条件语句
4.2.1if语句
4.2.2switch语句
4.2.3if/switch语句中的初始化语句
4.3循环语句
4.3.1while语句
4.3.2for语句
4.4跳转语句
4.5实战: 控制台游戏——Pong游戏
4.5.1Pong游戏
4.5.2初始化
4.5.3绘制场景
4.5.4让球动起来
4.5.5事件处理: 用挡板击打球
4.6习题
第5章复合类型: 数组、指针和引用
5.1引用
5.2指针
5.2.1指针类型
5.2.2指针的其他运算
5.2.3void*无类型指针
5.2.4指针的指针
5.2.5指针的引用
5.2.6引用和指针的比较
5.3数组
5.3.1数组和下标运算符
5.3.2复杂的数组声明
5.3.3C风格字符串
5.3.4指针访问数组
5.3.5range for
5.3.6多维数组
5.4动态内存
5.4.1程序堆栈区
5.4.2new和delete运算符
5.4.3动态内存表示多维数组
5.5const修饰符
5.5.1const和指针
5.5.2const对象的引用
5.6实战:查找、排序、最短路径
5.6.1二分查找
5.6.2排序: 冒泡、选择
5.6.3Floyd最短路径算法
5.7习题
第6章函数
6.1函数是命名的程序块
6.1.1最大公约数
6.1.2函数的定义
6.2静态变量
6.3函数的形参
6.3.1参数传递
6.3.2默认参数
6.3.3数组作为形参
6.3.4const与形参
6.3.5可变数目的形参
6.4递归函数: 调用自身的函数
6.4.1递归和递归函数
6.4.2实战: 二分查找的递归实现
6.4.3实战: 汉诺塔问题
6.4.4实战: 快速排序算法
6.4.5实战: 迷宫问题
6.5函数重载与重载解析
6.5.1函数重载
6.5.2重载解析
6.5.3const对象的引用或指针
6.6inline函数
6.7constexpr
6.8实战: 二维字符图形库ChGL
6.8.1如何在字符终端上绘图
6.8.2字符图形库ChGL
6.8.3曲线绘制API函数plot()
6.9实战: 基于ChGL的控制台游戏
6.9.1游戏程序的框架
6.9.2用ChGL和函数重写Pong游戏
6.10实战: 机器学习线性回归
6.10.1机器学习
6.10.2假设函数、回归和分类
6.10.3线性回归
6.10.4多变量函数的最小值、正规方程
6.10.5梯度下降法
6.10.6梯度下降法求解线性回归问题: 模拟数据
6.10.7批梯度下降法
6.10.8房屋价格预测
6.10.9样本特征的规范化
6.10.10预测房屋价格
6.11习题
第7章类和对象
7.1面向对象编程
7.2类
7.2.1定义一个类
7.2.2定义类的对象(变量)
7.2.3成员函数
7.2.4this指针
7.2.5类对象的大小
7.3构造函数
7.3.1创建类对象的构造函数
7.3.2初始化成员列表
7.3.3拷贝构造函数
7.3.4赋值运算符: operator=
7.3.5隐式类型转换、explicit
7.3.6委托构造函数
7.3.7delete
7.3.8类对象数组
7.3.9类体外定义成员函数和构造函数
7.4访问控制和接口
7.5const对象、const成员函数、mutable成员变量
7.5.1const对象和const成员函数
7.5.2重载const
7.5.3mutable成员变量
7.6析构函数
7.7静态成员
7.7.1非静态成员变量和静态成员变量
7.7.2静态常量
7.7.3静态成员函数
7.7.4类自身类型的静态成员变量
7.8友元
7.9内联成员函数
7.10重新定义拷贝构造函数和赋值运算符函数
7.11实战: 线性表及应用
7.11.1线性表
7.11.2线性表的顺序实现: 顺序表
7.11.3线性表的链式实现: 链表
7.11.4实现一个图书管理的程序
7.12实战: 面向对象游戏——基于链表的贪吃蛇游戏
7.12.1面向对象游戏引擎
7.12.2贪吃蛇游戏
7.13习题
第8章运算符重载
8.1运算符重载的2种方式
8.2赋值运算符=
8.3下标运算符[]
8.4输入输出运算符
8.5比较运算符
8.6函数调用运算符()
8.7类型转换运算符
8.8自增和自减运算符
8.9可以重载的运算符
8.10实战: 矩阵
8.11习题
第9章派生类
9.1继承与派生
9.1.1继承关系和派生类
9.1.2is a和belong to
9.1.3派生类的定义
9.1.4成员的隐藏
9.1.5继承方式
9.1.6基类指针和派生类指针
9.2派生类的构造函数和析构函数
9.3多继承和虚基类
9.3.1多继承
9.3.2虚基类
9.4多态
9.4.1对象的切割和类型转换
9.4.2基类指针(引用)和向下类型转换
9.4.3虚函数和多态
9.4.4虚函数的一些语法规则
9.4.5基类指针数组
9.4.6虚析构函数
9.4.7纯虚函数和抽象类
9.5实战: 仿“雷电战机”游戏
9.5.1精灵
9.5.2游戏引擎GameEngine
9.5.3碰撞检测和精灵的销毁
9.5.4让敌方战机运动和发射子弹
9.6习题
第10章模板
10.1函数模板
10.1.1函数模板的定义与实例化
10.1.2模板参数推断
10.1.3模板专门化
10.1.4函数模板和重载
10.1.5模板的返回类型推断
10.1.6非类型模板参数
10.1.7模板模板参数
10.1.8模板参数的默认值
10.1.9可变模板参数
10.1.10constexpr if
10.2类模板
10.2.1标准库类模板vector
10.2.2类模板Vector
10.2.3定义类模板的成员函数
10.2.4类模板的模板参数推断
10.2.5类模板的专门化
10.2.6类模板的友元
10.2.7类模板std∷initializer_list
10.3实战: 强化学习QLearning求解最佳路径
10.3.1强化学习
10.3.2QLearning
10.3.3QLearning的C 实现
10.4习题
第11章移动语义
11.1左值和右值
11.1.1左值和右值概述
11.1.2左值和右值的转换
11.1.3左值引用和右值引用
11.2移动
11.2.1复制和移动
11.2.2移动构造函数
11.2.3移动赋值运算符函数
11.2.4std∷move
11.2.5右值引用
11.2.6push_back()
11.3习题
第12章函数指针、函数对象、Lambda表达式
12.1函数指针
12.1.1函数类型和函数指针类型
12.1.2给函数指针类型起别名
12.1.3函数指针作为其他函数的参数
12.2函数对象
12.3Lambda表达式
12.3.1定义和使用Lambda表达式
12.3.2捕获子句
12.3.3返回类型
12.3.4Lambda表达式的实质
12.4std∷function
12.5std∷bind
12.6习题
第13章C 标准库介绍
13.1输入输出流库
13.1.1C 的I/O流库
13.1.2格式化输入输出
13.1.3非格式化输入输出
13.1.4文件位置
13.1.5流状态
13.1.6管理输出缓冲区
13.1.7文件输入输出
13.1.8字符串流
13.2容器
13.2.1标准容器
13.2.2序列容器
13.2.3容器适配器
13.2.4关联容器
13.3迭代器
13.3.1迭代器及其分类
13.3.2迭代器适配器
13.3.3数组、字符串和迭代器
13.4算法
13.4.1自定义通用算法
13.4.2策略参数
13.4.3标准库的常用算法
13.5智能指针
13.5.1raw指针和智能指针
13.5.2unique_ptr
13.5.3shared_ptr
13.5.4weak_ptr
13.6字符串
13.6.1字符: cctype、cwctype
13.6.2C风格字符串
13.6.3C 的字符串
13.7习题
第14章异常处理
14.1错误和异常处理
14.1.1错误的分类
14.1.2传统的错误处理方法
14.1.3C 的异常处理
14.2throw、try、catch
14.2.1throw
14.2.2try、catch
14.2.3异常类型的匹配
14.3堆栈展开和RAII
14.3.1堆栈展开
14.3.2资源获取即初始化
14.4习题
参考文献
C 编程语言以其具有“可操纵底层硬件”“程序效率高”和“面向对象”的优势被广泛应用于系统软件和应用软件的开发,不但是企业界开发重量级软件或平台的首选语言,也是国内外高校广泛采用的计算机编程教学语言,更是衡量一个程序员功力的标尺。
然而,尽管企业界早已使用C 11/14/17标准,但国内高校仍然延用的是传统的、过时的C 98标准,已经和业界普遍使用的现代C 语法标准有很大的脱节。
目前市场上还未见到国内作者编写的现代C 语言教材,虽然有少量国外作者编写的现代C 语言教材,但国外作者的思维模式和语言文化差异使得这些书难以被国内读者,特别是初学者阅读理解,这些书往往都是大部头的著作,令人望而生畏。由于C 语言本身语法的复杂,琐碎的语法讲解使初学者感到枯燥乏味; 缺少实践性的例子,初学者很难理解这些语法知识的价值和适用场景,不知如何将这些语法知识应用于实际编程中。这就造成了许多学过C 语言的计算机专业的本科毕业生实际并没有掌握最基本的C 编程知识,缺乏实际应用编程的能力。
本书作者在C 课程的教学中深感缺少一本适合中国读者的、没有冗余语句、注重实战的现代C 教材。于是参考了各种英文教材和网上资料,编写了这本面向初学者的、遵循C 17标准的语法与实践结合的入门教材,并且书中的实战案例对于有经验的程序员也很有参考价值。
本书的编写遵循下面几个目标。
(1) 针对没有任何编程基础的学生,直接讲解最新的C 17标准,避免传统的从C到C 的教学模式和国内高校采用的过时的C 98标准语法,使读者可以直接学会使用最新的现代C 语法特征,如auto、range for、Lambda、移动语义、变长模板等,避免了C和C 比较式教学带来的混乱,也不需要浪费时间在C 旧标准语法上,可使无编程基础的初学者在较短时间内快速掌握现代C 编程语言的核心内容。
(2) 突出重点,讲解主要的常用语法,而不是一本面面俱到的语法手册,由浅入深、由易到难,尽量用浅显易懂的例子说明语法概念,力求简明扼要,避免空洞的概念和冗长的描述。
(3) 从入门到实战,只有通过具体、长期的实战训练,才能逐步熟练精通一门编程语言。语法知识可能短时间就能理解,但只有通过大量的实战训练才能真正熟练使用一门编程语言。本书准备了从游戏编程、信息管理、数据结构、机器学习、人工智能等不同领域的一些经典的实战案例,希望这些案例能够帮助读者消化语法知识、提高学习兴趣,逐步将C 用于解决各种实际问题,避免出现“只会考试而不会编程”的普遍问题。
由于实战案例涉及一些其他学科专业知识,初学者和教师可以根据自己的需要选读实战部分,甚至完全跳过实战案例也不影响C 17语言的教学。本书的源代码可以登录清华大学出版社网站(www.tup.com.cn)下载。
由于作者知识和水平所限,错误之处在所难免,欢迎读者批评指正。
作者2019年1月
3.1运算符
运算符是对数据进行数学或逻辑操作的特殊符号,如运算符 、*、||分别表示加、乘、逻辑或。运算符对数据进行运算就构成了表达式。
3.1.1运算符的分类
根据功能的不同,运算符可分为算术、比较、逻辑、位、赋值等,如表31所示。
表31运算符的功能分类
功能运算符
算术 、-、*、/、%(求余数)、 (自增1)、–(自减1)
比较>、=、<=、!=(不等于)
逻辑&&(逻辑与)、||(逻辑或)、!(逻辑非)
位&(与)、|(或)、^(异或)、~(补)
赋值=、 =、-=、*=、/=、%=、&=、^=
根据参与运算的运算数的个数,运算符可分为一元、二元、三元运算符。
如加法运算符 需要2个运算数,称为二元运算符。而自增运算符 ,只使一个运算数自己增加1。如:
int a = 2;
a;//a的值从2变成了3,即自增了1,即相当于a = a 1
std∷cout<
这种只对一个运算数进行运算的运算符叫作一元运算符。
三元运算符只有一个,即条件运算符?:。其格式为:
exp1?exp2:exp3
该条件运算符对3个运算数即3个表达式exp1、exp2、exp3进行条件运算。整个表达式的值根据exp1的值是否为true(真)或非0而取exp2或exp3的值。即如果exp1的值是true(真)或非0值,整个表达式的值就是exp2的值,否则是exp3的值。
例如,假设要求a、b两个数的最小值,可以这样:
a
如果a假如要求3个数a、b、c的最小值,可以用下面的语句:
a
即如果a可以用一小段代码测试一下上述代码:
#include
int main(){
int a,b,c;
std∷cin>>a>>b>>c;
int min = a
std∷cout<
<
}
评论
还没有评论。