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》