在编译过程中,我们常常需要有执行重复操作和决策的工具,C++提供了这样的一种工具。
1.设置初始值
2.执行测试
3.执行循环操作
4.更新用于测试的值。
5.继续执行测试。
在for循环当中,初始化、测试和更新操作构成了控制部分,用()将其括起。每一个部分都是一个表达式,彼此由分号隔开。控制部分后面的语句叫循环体,只要测试的结果为非零值或true,他便被执行。
for(initialization;test-expression;update-expression) body;
C++语法将整个for看作一条语句——即使整个for循环中包含着一条或多条语句。
循环只执行一次初始化。通常将初始化的变量用作计算循环周期。
在测试表达式中决定循环是否被执行。通常为关系表达式,在测试表达式中,如果比较结果为真,则程序将执行循环体,false则跳出循环。在测试表达式中可以使用任意表达式,C++会将结果转换为bool类型。
for循环时入口条件循环,这意味着,在每一轮循环之前,都将计算测试表达式的值,在结果为false时,才会跳出循环。
在更新表达式中,通常在一次循环结束后触发,也就是说,更新表达式在每轮循环结束时执行,此时循环体已经执行完毕。它通常用来对跟踪循环轮次的变量的值进行增减。
在C++中,for是关键字,因此编译器不会将for视为一个函数。
C++中,for循环通常由两种使用方式:
1.当循环体只有一条语句时:
for(int i = 0; i < 8; i++) body;
注意上述中的代码,并没由花括号的存在,在for循环中,循环体必须是一条语句。但在上述代码中,我们省略了花括号。
假设在循环体中包含多条语句,而对循环体进行了缩进:
for(int i = 0; i < 9; i++) cout << "这一位数字为:" << endl; cout << i << endl;
上述代码将会报错,原因是无法检测到i变量。
原因很简单,编译器在看到上述代码的时候,将会忽略缩进,因此,只有第一条语句位于循环中,后面的打印i值将会不存在于for循环中,且变量i是在for循环中定义的,当执行完for循环后,变量i的空间将会被释放,此时的变量i也就不存在了,当编译器看到打印i值时,就会提示未检测到变量i的定义。
我们想要在循环体中包含多条语句,就必须使用到花括号:
2.循环体由多条语句时,必须使用花括号:
for(int i = 0; i < 9; i++){ int y = 89; cout << y << endl; }
用花括号括起来的循环体将形成一个完整的语句块,但要注意的是,与之前的代码一样,变量y仅当程序执行该语句块中的语句时,该变量才会存在。
int j = 1; for (int i = 0; i < 3; i++) { cout << j << endl; int j = 0; cout << j << endl; };
在上述代码中,首先在for循环外定义了一个变量j,而在循环体内又定义了一个变量j,那么在声明位置到内部语句块结束的范围内,新变量将隐藏旧变量;然后旧变量再次可见。
与for循环不同的是,while是没有初始化和更新部分的,只有测试条件和循环体:
while(test-condition){ body; }
在程序运行的时候,编译器首先计算圆括号内的测试条件表达式。如果该表达式为true,则执行循环体。执行完循环体后,程序返回测试条件,对它从新评估,如果为true,则继续执行循环,直到测试条件为false。
和for循环一样,while也是入口条件循环。所以,当一开始测试条件就为false的时候,程序就不会进入循环。
在C++中,for和while循环本质上是相同的。
正是因为这一份等效,所以在书写代码时究竟因该用谁只是风格问题,但在有些情况下,比如您设计代码时并不知道应该循环多少次时,应该使用while循环。
下述代码中的for和while实现同样的功能。
for(init-expression;test-expression;update-expression){ statement(s) } init-expression; while(test-expression){ statement(s) update-expression; } //while改for while(test-expression){ body } /*for循环需要3个表达式,只有两个分号是必需的。 当省略test-expression时,系统默认其为true,循环将一直持续下去*/ for(;test-expression;){ body }
注意,下面代码由于省略了所有表达式,所以循环将一直持续下去。
for(;;){ body }
在设计循环时,应该记住以下几点原则来帮助我们避免一些不必要的问题。
1.指定循环终止条件。
2.在首次测试之前初始化条件。
3.在条件被再次测试之前更新条件。
do while循环与for循环不同的是,for循环属于入口条件,即在执行循环体之前会进行测试,而do while是出口条件,意味着这种循环将首先执行循环体,然后再判定测试表达式,决定是否应该继续执行循环。
执行语法如下:
do{ body } while(test-expression)
在C++11中新增了一种循环——基于范围的for循环。使得对数组或容器类的每个元素执行相同的操作。
double price[3] = {6.8,8.6,8.9}; for(double x: price){ cout << x << std::endl; }
上述代码中,x表示数组price的第一个元素。显示第一个元素后,不断执行循环,而x依次表示数组的其他元素。因此,上述代码显示全部元素,每个元素占据一行。
注意下属代码中给予x取址符号,使得可以直接修改数组中的值,而不是修改数组副本的值。
double price[3] = {6.8,8.6,8.9}; for(double &x: price){ x +=1; cout << x << std::endl; }