文章目录
- 5.1 for循环
- 5.1.1 for循环的组成部分
- 5.1.2 回到for循环
- 5.1.3 修改步长
- 5.1.4 使用for循环访问字符串
- 5.1.5 递增运算符 (++)和递减运算符(--)
- 5.1.6 副作用和顺序点
- 5.1.7 前缀格式与后缀格式
- 5.1.8 递增/递减和指针
- 5.1.9 组合赋值运算符
- 5.1.10 复合语句![](https://i-blog.csdnimg.cn/blog_migrate/d44e8c0df4769a9a389abd287be3bb91.png)
- 5.1.11 逗号运算符
- 5.1.12 关系表达式
- 5.1.13 赋值、比较和可能犯的错误
- 5.1.14 C-风格字符串比较
- 5.1.15 比较string类字符串
- 5.2 while循环
- 5.3 do while循环
- 5.5 循环和文本输入
- 5.6 嵌套循环和二维数组
- 5.7 总结
本篇文章将对《C++PrimerPlus》第3章进行勾画
以我个人习惯来勾画
C和C++不同点将用红色高亮表示
关于C++的额外补充知识用蓝色高亮表示
对C++的注意点以及总结部分用绿色高亮表示
本专栏正常情况2周更新一次
5.1 for循环
5.1.1 for循环的组成部分
- for循环有4个部分,初始化、测试、更新操作、循环语句,前三个部分称为
控制部分
- 初始化之后执行一次
- C++把测试结果的值强制转换为
bool
类型0->fasle,非0->true- 任何值和任何有效值和运算符的组合都是表达式,C++中每个表达式都有值
- cout.setf(ios::boolalpha)可以命令cout显示true和false而不是0,1
- 当判定表达式的值时改变了内存中数据的值,我们说表达式有副作用
- 只要加上分号,所有的表达式都可以称为语句
- 从语句中删除分号,不一定是表达式,比如int a;
- C++允许将for循环中的初始化部分替换成定义变量
5.1.2 回到for循环
5.1.3 修改步长
5.1.4 使用for循环访问字符串
string类的size成员函数可以求出字符串的长度
5.1.5 递增运算符 (++)和递减运算符(–)
- 递增运算符和递减运算符会使操作数+1或者-1
- 前缀和后置对操作数影响的效果一样,但是影响时间不同
- 在同一条语句中对同一个操作数进行多次递增或递减的行为是未定义的
5.1.6 副作用和顺序点
- C++程序在进入下一条语句中会对上一条语句的副作用进行评估
5.1.7 前缀格式与后缀格式
- 对于内置的前缀和后缀格式没有茶杯
- 自定义的前后缀前缀的效率更高
5.1.8 递增/递减和指针
- *++pt–>前缀++优先级和解引用一样,结合性从右往左,所以先得到pt所指向的数据,然后另pt指向下一个元素是
- ++*pt–>将pt所指向的数据+1
- (*pt)++ -->后缀++优先级高于解引用,但是这里有聚组,所以先取出pt所指向的数据,然后将该数据+1
- *pt++ -->先另pt指向下一个元素,在取得该元素的值
5.1.9 组合赋值运算符
- 复合运算符的左操作数必须是可以改变的
5.1.10 复合语句![](https://i-blog.csdnimg.cn/blog_migrate/d44e8c0df4769a9a389abd287be3bb91.png)
- 使用
{}
可以将{}
中的内容看作一条语句- 外部定义的变量内部仍然可以使用
- 外部和内部都定义了同名的变量,在内部只能访问到内部定义的
5.1.11 逗号运算符
- 逗号运算符用法(表达式1,表达式2, 表达式3)
- 使用逗号运算符可以在for循环中同时给多个变量复制,也可以调整多个变量
- 逗号不一定代表逗号表达式,有可能是分隔符(定义变量时)
- 逗号运算符是一个顺序点,逗号表达式的值是最后一部分的值
- 所有操作符中逗号表达式的优先级最低
5.1.12 关系表达式
- 关系表达式的结果为bool类型,true表示真,false表示假
- 不能将关系运算符使用于C-风格字符串,但是可以用于string类对象
- 关系运算符的优先级比算术运算符的优先级低
5.1.13 赋值、比较和可能犯的错误
- 赋值使用
=
- 判断相等使用
==
5.1.14 C-风格字符串比较
- C风格字符串比较时比较的是字符串每个字符对应的编码值
- 使用
strcmp
才能判断两个C风格字符串相等,字符串相等返回0,不相等返回非0- C风格字符串是通过字符串结尾的空字符定义的,而不是由其所在的数组长度定义
5.1.15 比较string类字符串
- string类对象对关系运算符进行了重载,所以可以使用
关系运算符
判断string类对象是否相等- 可以像访问C风格字符串一样访问string类对象的字符
5.2 while循环
- while循环由测试条件和循环体两部分构成,因此如果不需要死循环,那么需要在循环体内执行可以影响测试条件表达式的操作。
- 想要打印字符对应的ASCII码,必须将字符强转为int类型
- string类对象不使用空白字符来标记串的末尾,具体什么标志末尾后面会说
5.2.1 for与while
- for循环与while循环几乎等价,差别:for循环可以在初始话部分生成一个局部变量,while不可;for中省略了测试条件默认为true,while不可;
continue
对二者的效果可能会不同
5.2.2 延时循环
- 使用ctime文件中的
clock()
函数可以获取程序总开始到调用的系统时间- 使用
clock()
函数和CLOCK_PER_SEC
可以获取从程序开始到调用的秒数clock()
函数的返回值类型可能是long、unsinged long,所以定义系统别名clock_t
作为clock()
函数的返回值类型- 可以使用
#define
和typedef
定义系统别名,在定义比较复杂是使用typedef
5.3 do while循环
- do while循环是出口循环
5.4 基于范围的for循环
5.5 循环和文本输入
- cin对象支持三种不同模式的单字符输入
5.5.1 使用原始的cin输入
cin读取char时会忽略空白符
- 只有按下回车后,输入的内容才会被发送给程序
5.5.2 cin.get(ch)
- cin.get(ch)是cin类中的一个成员函数,该成员函数的参数是C++引用类型的
- cin.get(ch)可以从标准输入流中读取任何字符存放在ch中
5.5.3 使用哪一个cin.get()
- cin.get成员函数通过函数重载支持参数为char,char* int,空的参数
5.5.4 文件尾条件
- 允许用文件替换键盘输入
- 很多操作系统允许通过键盘模拟文件末尾条件
EOF
,Unix
通过ctrl+D
,Windows
通过ctrl+Z+<enter>
模拟文件结尾- 检测到
EOF
后,cin.fail()和cin.eof()函数返回值为true,否则为false,这两个成员函数读取最近的结果因此需要将它们放在读取后面- cin.get(ch)函数返回一个cin对象,当cin对象出现在逻辑表达式中时,会调用
转换函数
,如果读取成功cin对象在逻辑表达式中被转换为true
否则为false
5.5.5 另一个cin.get()版本
- 两种输入字符方式的比较
5.6 嵌套循环和二维数组
- C++通过一维数组定义二维数组,二维数组是元素为一维数组的一维数组
5.6.1 初始化二维数组
- 二维数组的初始化和一维数组一样需要用
{}
,并且二位数组的每个元素初始化需要和一维数组一样使用{}