代码改变世界

for重复结构

2015-06-03 13:31  along_may  阅读(537)  评论(0编辑  收藏  举报

for重复结构处理计数器控制循环的所有细节。要演示for的功能,可以改写图2.16的程序,结果如图2.17。

执行for重复结构时,声明控制变量counter并将其初始化为1。然后检查循环条件counter <=10。由于counter的初始值为1,因此条件满足,打印Counter的值(1)。然后在表达式Counter++中递增控制变量counter,再次进行循环和测试循环条件。由于这时控制变量等于2,没有超过最后值,因此程序再次执行语句体。这个过程一直继续,直到控制变量counter递增到11,使循环条件的测试失败,重复终止。程序继续执行for结构后面的第一条语句(这里是程序末尾的return浯句)。

// Fig. 2.17:fig02 17.cpp
// Counter-controlled repetition with the for structure
#include < iostream.h>
int main()
{
	// Initialization, repetition condition, and incrementing
	// are all included in the for structure header.
	for ( iht counter = 1; counter <= 10; counter++ )
	cout << counter << endl;
	return O;
}
图 2.17 用for结构的计数器控制重复

图2.18更进一步研究了图2.17中的for结构。注意for结构指定计数器控制重复所需的每个项目。如果for结构体中有多条语句,则应把语句体放在花括号中。

注意图2.17用循环条件counter <=10。如果循环条件变为counter<lO,则循环只执行9次,这种常见的逻辑错误称为差1错误。

              for
               关键字   控制变量名           控制变量终值
                 ↓         ↓                     ↓
                for ( int counter = 1; counter <= 10; counter++)
                                       -------------
                                    ↑          ↑           ↑
                            控制变量初始化   循环条件     控制变量递增

                                   图 2.18 典型for首部的组件
常见编程错误2.13

while或for条件中使用不正确的关系运算符和不正确的循环计数器终值会导致差1的错误。

编程技巧2.20

在while或for条件中使用终值和用关系运算符 <=可以避免差1的错误。例如,对打印1到10的循环,循环条件应为counter<=10而不是counter<10(导致差1错误)或counter(虽然正确)。许多程序员喜欢基于O的计数,在循环中重复10次.courter初姑化为O,循环条件测试为counter<10。

for结构的一般格式如下:

for(expression1;expression2;expression3) 
        statement  

其中expression1初始化循环控制变量的值,expression2是循环条件,expression3递增控制变量。大

多数情况下,for结构可以表示为等价的while结构:

  expression1
    while(expression2){
        statement
        expression3;
    }

惟一的例外将在2.18节介绍。

如果for结构首部中的expression1(初始化部分)定义控制变量(即控制变量类型在变量名前 面指定).则该控制变量只能在for结构体中使用,即控制变量值是for结构之外所未知的。这种限制控制变量名的用法称为变量的作用域(scope)。变量的作用域定义其在程序中的使用范围。作用域将在第3章“函数”中介绍。

常见编程错误2.14

如果for结构首部中的初始化部分定义控制变量,则在该结构体之后使用这个控制变量是个语法错误。

可移植性提示2.1

在新的C++草案标准中,for结构初始化部分声明的控制变量范围与旧式的C++编译器中不同。旧式的c++编译器产生的C++代码在支持新的C++草案标准妁编译器中编译时可能遭到破坏。可以用两个编工程策略防止这个问题:在每个for结构中定义不同名称的控制变量或者在多个for结构中定义相同名称的控制变量,并在第一个for循环之外和之前定义控制变量。

有时,exprossion1和expression3是由逗号分开的表达式列表。这里用逗号作为逗号运算符(comma operator),保证从左向右求值表达式列表。逗号运算符在所有C++运算符中的优先级量低。逗号分隔表达式列表的值和类型是列表中最右边表达式的值和类型。逗号运算符最常用于for结构,其主要用途是让程序员使用多个初始化表达式或多个递增表达式。例如,一个for结构中可能有多个控制变量需要初始化和递增。

编程技巧2.21

只把涉及控制变量的表达式放在for结构的初始化和递增部分。其他变量的操作应放在循环之前(如果像初初化语句一样只执行一次)或循环体中(如果对每个循环环执行一次,如递增和递减语句)。

for结构中的三个表达式是可选的。如果省略expression2,则C++假设循环条件为真,从而生成无限循环。如果程序其他地方初始化控制变量,则可以省略expression1。如果for语句体中的语句计算增量或不需要增量,则可以省略expression3。for结构中的增量表达式就像是for语句体末尾的独立语句。因此,下列表达式:

在for结构的递增部分都是等价的。许多程序员喜欢counter++,因为递增在执行循环体之后发生,因此,后置自增形式似乎更自然。由于这里递增的变量没有出现在表达式中,因此前置自增与后置自增的效果相同。for结构首部中的两个分号是必需的。

常见编程错误2.15

for结构首部中的两个分号改成逗号会造成语法错误。

常见编程错误2.16

将分号放在for结构首部的右括号后面令使该for结构体变为空语句.通常是个逻辑错误。

软件工程视点2.9

将分号放在紧接着for结构首部的后面有时可以生成所谓的延迟循环。这种for的循环体是空语句,表示计算空循环的次数。例如,可以用空循环减慢程序速度,以避免其在屏幕上输出太快,无法阅读。

for结构的初始化、循环条件和递增部分可以用算术表达式。例如,假设x=2和y=10,如果x和y的值在循环体中不被修改,则下列语句:

for   (int j= x; j   <= 4* x* y; j += y/ x )

等于下列语句:

for(int   j=2;j  <=80;j+=5)

for结构的增量也可能是负数(实际上是递减,循环向下计数)。

如果循环条件最初为false,则for结构体不执行,执行for后面的语句。for结构中经常打印控制变量或用控制变量进行计算,控制变量常用于控制重复而不在for结构体中提及这些控制变量。

编程技巧2.22

尽管控制变量值可以在for循环体中改变,但最好不要这样做,固为这样可能造成一定的逻辑错误。

for结构的流程图与while结构相似。例如,图2.19显示了下列for语句的流程图:

for(int counter=l;counter >=10;counter++)
cout << counter<< endl;

从这个流程图可以看出初始化发生一次,井在每次执行结构体语句之后递增。注意,流程图(除了小圆框和流程之外)也只能包含表示操作的矩形框和表示判断的菱形框。这是我们强调的操作/判断编程模型。程序员的任务就是根据算法使用堆栈和嵌套两种方法组合其他几种控制结构,然后在这些框中填入算法所要的操作和判断,从而生成程序。

2016考研复试技巧http://www.kyjxy.com/fushi/zhinan/
考研专硕备考资料http://www.kyjxy.com/zhuanshuo/
考研院校政策http://www.kyjxy.com/yuanxiao/zhengce/