《C++ Primer Plus》《5、循环和关系表达式》

1 for循环

以之前的记录班级同学成绩为例,记录每个人的成绩是一个重复的操作,如果说每次记录成绩都需要一个单独的语句是十分耗时的,所以C++语言出现了循环语句来处理重复的操作。计算机在处理日常的工作时,需要执行重复的任务,为此C++提供了这样的工具:for循环,while循环,do-while循环等等来进行处理。

1.1for循环的组成部分

for循环的组成需要完成以下的步骤:
1)设置初始值
2)执行测试,看循环是否应当继续进行
3)执行循环操作
4)更新用于测试的值

for(initialization,test-expresion,update-expresion)
	body;

在这里插入图片描述

1.2回到for循环

书中给出了一个示例,让for循环完成了阶乘的求值,并打印了出来。

1.3修改步长

大多数情况下,默认步长为1,但其实步长是可以根据实际情况进行修改的。

1.4使用for循环访问字符串

书中给出了一个示例,输入一个字符串,然后逆向输出。输入的是string类型的word,为了确定循环的次数,通过word.size()获得字符串的长度,进而实现程序的功能。

1.5递增运算符和递减运算符

以自增运算符为例进行讲解,x++与++x两者表达的最终结果是一样的,但实际过程并不相通。
x++: y=x,x = x+1;
++x: x = x+1,y = x;
自减原理相同。

1.6副作用和顺序点(了解)

副作用:在计算表达式时对某些东西进行了修改;
顺序点:程序执行过程中的一个点,在这里进入下一步之前将确保对所有的副作用进行了评估。
在for循环中分号就是一个顺序点,在分号之前,执行的所有修改都必须完成。

1.7前缀格式和后缀格式

++x,x++,前者是前缀,后者是后缀,这对程序的执行没有太大的影响,执行速度可能有细微的差别。对于内置类型没有差别,对于用户定义的类型,前缀的效率会更高一些,后缀的话会有一个版本复制的问题。

1.8递增/递减运算符和指针

要搞清楚这四个表达式的含义。

//1)*++pt  2)++*pt   3)(*pt)++  4)*pt++
double arr[5]={1.0,2.0,3.0,4.0,5.0}
double *pt = arr;

在初始情况下默认pt指向的是数组的第一个元素。
1)

* ++  pt  

表示的是 *(++pt)得到的是arr数组的第二个元素;
2)

++*pt

表示的是++(*pt)指向的这个元素数值上再+1;
3)

(*pt)++

指向这个元素的数值上再+1;
4)

*pt++

获得是还是*pt的数值,但是指针已经后移了;

1.9组合赋值运算符

是表达式的一种简化的操作。
在这里插入图片描述

1.10复合语句(语句块)

C++的for循环,要求比较严格,循环体必须是一条语句,但是实际过程中,往往需要循环执行多种操作,所以可以用两个花括号来构造一条复合语句。建议在实际写代码的过程中为了避免出错,对执行语句加上一个花括号。

1.11 其他语法技巧——逗号运算符

在for循环的表达式中,除了分号运算符,是将三种情况隔绝开的,比如update-expresion中不一定只有一个操作,可能其中会涉及到多个变量的操作。
例如for(j=0,i=word.size()-1;j<i;–i,++j),其中—i与++j是两种同时进行的操作,就可以用逗号分隔。

1.12 关系表达式

在这里插入图片描述

1.13 赋值,比较和可能犯的错误

在C语言中=是赋值运算符,==才是判断是否相等的比较运算符,要注意区别。若是混淆的话,赋值运算符的结果是真的,会导致判断条件一直为真,程序会一直执行下去。

1.14 C风格字符串的比较

本小结主要引入了一个函数strcmp()函数,这是一个检测相等或排列顺序的函数。现在有字符串str1与str2.
如果str1与str2相等:strcmp(str1,str2) == 0
如果str1在str2的前面:strcmp(str1,str2) < 0
如果str1在str2的后面:strcmp(str1,str2) > 0

1.15 比较string类字符串

在上一小节是字符串数组的比较,用了strcmp,如果使用的是string对象,C++中直接对!=运算符进行了重载,来判断字符串是否相等,使用起来更加地自由。

2 while循环

while循环没有初始化和更新部分的for循环,它只有测试条件和循环体。

while(test-condition)
	body

在这里插入图片描述

2.1 for与while

for循环与while循环之间可以进行相互转换,在无法预知循环次数的前提下,通常使用while循环。

2.2编写延时循环

需要添加头文件,引入一个符号常量,CLOCK_PER_SEC,该常量等于每秒钟包含的系统时间单位数。书中给出了示例代码。

3do-while循环

do-while循环是出口条件循环,首先先执行循环体,然后再判定测试表达式,决定是否应该继续执行循环。
do-while循环的语法:

do
	body
	while(test-expresion);

在这里插入图片描述

4基于范围的for循环(C++11)

C++11增加了一种循环:基于范围的(range-based)for循环,书中给出了示例代码。这是C++11新增的内容,简化了常见的循环任务,对数组(容器类,如vector和array)的每个元素执行相同的操作,个人觉得简洁优雅且实用。

double prices[5] = {1.0,2.0.3.0,4.0,5.0};
for(double x : prices)
	cout << x<<std::endl;

5循环和文本输入

循环的一种应用:逐字符地读取来自文件或键盘的文本。

5.1使用原始的cin进行输入

书中给出了示例程序,通过cin与循环来读取来自键盘的文本输入。cin输入的字符被存入缓冲区,在用户按下回车键之后,整个字符序列才被发送给程序。书中给出了示例程序,但是这个程序存在一定的问题,他无法将空格也算在内,只能显示字符串。

5.2使用cin.get(char)进行补救

在上节代码的基础上作出改进,使用cin.get()替代cin。主要是cin.get()的功劳,cin.get(ch)读取输入中的下一个字符(即使是空格),并将其赋值给ch。因此便能够也将空格显示出来。

5.4文件尾条件

文件尾是针对文本输入输出提出来的,如果输入来自文件,可以使用功能更加强大的技术——检测文件尾(EOF)
1)EOF结束输入
cin方法检测到EOF时,将设置cin对象中一个指示EOF条件的标记;设置这个标记后,cin将不再读取输入。
2)常见的字符输入做法

while(cin.fail() == false){   //test for EOF
	…
	cin.get(ch);
}

也可以while(!cin.fail())
也可以while(cin)
或者 while(cin.get(ch))

5.5另一个cin.get()版本

C语言中的getchar()和putchar(),仍然在C++中适用。

cin = cin.get();
cout.put(ch);

6嵌套循环和二维数组

C++没有创建二维数组,但是用户可以创建每个元素本身都是数组的数组。

6.1初始化二维数组

创建二维数组时,可以初始化其所有元素。对于二维数组来说,每一维的数组元素都是一个元素,因此初始化由一系列逗号分割的一维数组初始化组成。

6.2使用二维数组

在初始化二维数组后,对这样的二维数组进行操作,通常需要一个嵌套循环,书中给出了一个示例。

7 总结

介绍了for循环,while循环,do-while循环,并介绍了如何从文本文件中读取内容。

8 参考

8.1 《C++ Primer Plus》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值