循环语句(loop statement)根据一个表达式的计算结果是否为true,决定是否重复地执行一个语句块。主要有三种循环语句:for语句、while语句和do while语句。(建议先学习《语句和条件语句介绍》)
(1) for语句
for语句的语法形式如下:
for(初始语句; 循环判断条件; 迭代表达式)
{
语句块
}
“初始化语句”一般用来对循环控制变量进行初始化赋值,可以为空语句。
“循环判断条件”在每次循环开始前均执行一次,仅当其计算结果为true时才可以执行“语句块”。一旦其计算结果为false,则循环终止,该循环语句执行结束。所以循环执行次数一般等于该判断计算为true的次数。
“迭代表达式”在每轮循环完成后(即“语句块”执行完后)执行一次,该表达式一般用来修改循环控制变量。如果循环判断条件首次计算结果为false,则它永远不会被执行。
举个例子,如下for语句:
for(int iIndex=0; iIndex<2; ++iIndex)
{
std::cout << iIndex << std::endl;
}
则该语句执行过程完整步骤如下:
1. 执行初始化语句,即int iIndex=0;
2. 首次执行循环判断条件,即iIndex<2;此时变量iIndex值为0,该表达式结果为true,则进入循环体
3. 执行循环体语句块,即std::cout << iIndex << std::endl;
4. 执行迭代表达式,即++iIndex。变量iIndex值变化为1
5. 第二次执行循环判断条件,即iIndex<2;此时变量iIndex值为1,该表达式结果为true,则进入循环体
6. 执行循环体语句块,即std::cout << iIndex << std::endl;
7. 执行迭代表达式,即++iIndex。变量iIndex值变化为2
8. 第三次执行循环判断条件,即iIndex<2;此时变量iIndex值为2,该表达式结果为false。整个for语句结束
可参见MFC库文件“vector”里如下代码的用法:
(2) while语句
while语句的语法形式如下:
while(循环判断条件)
{
语句块
}
其语句含义为:当循环判断条件结果为true时,循环执行语句块,直至循环判断条件结果为false为止。
对比for语句,while语句语法结构未显式设置“初始化语句”和“迭代表达式”。该语句在实际使用时,一般将“初始化语句”仿真循环语句前,将“迭代表达式”包含在语句块里,即:
初始化语句
while(循环判断条件)
{
语句块
迭代表达式
}
显而易见,for语句和while语句可以很方便地互相转化。
可参见MFC库文件“wincore.cpp”里如下代码的用法:
(3) do while语句
do while语句的语法形式如下:
do
{
语句块
}
while(循环判断条件);
注意:do while语句需以分号(;)结束
其语句含义为:循环执行语句块,直至循环判断条件结果为false为止。
对比while语句,do while语句特点是其循环语句块至少会被执行一次。
可参见MFC库文件“afxwin.h”里如下代码的用法:
(4)break语句
break语句可用来终止整个循环语句。当循环语句多层嵌套时,break仅能跳出包含该语句的最里面循环语句。如:
for(int iIndex=0; iIndex<10; ++iIndex)
{
for(int iIndex2=10; iIndex2>0; --iIndex2)
{
if (iIndex > iIndex2)
{
break;
}
}
}
该break语句每次执行均会终止iIndex2变量所在的for循环语句。
(5)continue语句
continue语句可用来跳过当前正在执行的循环体语句块里的后续语句,但不能终止整个循环语句。如:
for(int iIndex=0; iIndex<10; ++iIndex)
{
if (5 == iIndex)
{
continue;
}
std::cout << iIndex << std::endl;
}
该continue语句会在第6次执行循环语句块时跳过,导致下方的std::cout打印语句不被执行。但后续的第7~10次循环依然会执行打印。
(6) 实用说明
- for语句的“初始化语句”应避免使用空语句,且尽量仅初始化一个循环控制变量。
- “迭代表达式”应尽量简单,一般使用自增、自减操作符。
- 复杂的循环语句应设置合理的防护,避免死循环。
- 多层循环嵌套应计算时间复杂度,避免程序执行效率过低。
- 多使用STL提供的算法来替代循环语句。
学习目标“最简单的循环语句介绍”已完成