### for 语句

for 循环语句能够按照已知的循环次数进行循环操作，它的语法格式为：

for (变量初始赋值,循环条件,变量递增或递减)

循环体;

下面利用 for 语句计算 1…100 的累加求和。从问题描述中我们可以欲知需要进行 100 次的加法运算。

int nSum = 0; //定义一个变量，记录累加的结果

for(int i=1; i<101; i++) //遍历 1…100，i 为循环变量

{

nSum += i; //累加求和

}

在 for 语句中包含了 4 部分，其中“int i=1”表示循环变量的初始赋值，“i<101”表示循环条件，“i++”表示循环变量递增，复合语句部分表示循环体。

上面的代码采用了循环变量递增的方式。当然，我们也可以采用倒叙的方式，以循环变量递减的方式进行。例如：

int nSum = 0; //定义一个变量，记录累加的结果

for(int i=100; i>0; i--) //遍历 100…1

{

nSum += i; //累加求和

}

在 for 语句中无论采用循环变量递增或递减的方式，有一个前提，就是一定要保证循环能够结束，无期限的循环（死循环）将导致程序的崩溃。在循环变量自增的例子中，循环的条件是 i<101，由于在每次循环后 i 的值会加 1，当 i 的值大于等于 101 时，循环就结束了。在循环变量自减的例子中，循环条件是 i>0，在每次循环后 i 的值会减 1，当 i 等于或小于 0 时，循环就结束了。

在 for 语句中，可以省略变量初始赋值、循环条件，甚至连同变量递增或递减也可以同时省略。但是一定要保证循环能够结束。例如：

int nSum = 0; //定义一个变量，记录累加的结果

int i = 0; //定义一个变量，初始化为 0，它作为循环变量

for(; i<101; i++) //省略了循环变量的初始赋值

{

nSum += i; //累加求和

}

如前所述，在 for 语句中可以同时省略变量初始赋值、循环条件和量递增或递减。例如：

int nSum = 0; //定义一个变量，记录累加的结果

int i = 0; //定义一个变量，初始化为 0，它作为循环变量

for(; ; ) //省略变量初始赋值、循环条件和量递增或递减

{

if (i > 100) //循环结束条件

break; //终止循环

nSum += i; //累加求和

i++; //累加循环变量

}

在上面的代码中虽然在 for 语句中省略了变量初始赋值、循环条件和量递增或递减。但是在循环体中却提供了循环结束条件和循环变量的递增，并且在 for 语句前定义了一个循环变量 i。因此，上面代码中 for 语句是合法的，并且可以正常运行。

在循环语句中使用 break 语句，表示将终止循环。此外，在循环语句中还可以使用 continue 语句，它的作用是结束本次循环，进行下一次循环。下面通过 2 个实例展示 break 语句和 continue 语句的作用和区别。

break 语句在循环中的应用

int main(int argc, char* argv[])

{

int nSum = 0; //定义一个变量，记录累加的结果

for(int i=1; i<101; i++ ) //遍历 1…100

{

if (i == 50) //如果 i 等于 50，终止循环

break;

nSum += i; //累加求和

}

cout << "结果: " << nSum << endl;

return 0;

}

运行程序，效果如图 1 所示。

图 1 break 语句

在上面的实例中，当循环变量 i 的值等于 50 时，循环终止了，整个循环语句计算从 1 到 49 的累加和，结果为 1225。

对上面的实例代码进行修改，将 break 语句替换为 continue 语句。

continue 语句在循环中的应用

int main(int argc, char* argv[])

{

int nSum = 0; //定义一个变量，记录累加的结果

for(int i=1; i<101; i++ ) //遍历 1…100

{

if (i == 50) //如果 i 等于 50，结束本次循环，进行下一次循环

continue;

nSum += i; //累加求和

}

cout << "结果: " << nSum << endl;

return 0;

}

运行程序，效果如图 2 所示。

图 2 continue 语句

上面的代码在循环变量 i 等于 50 时，结束本次循环，开始下一次循环。这就使得在 i 等于 50 时，没有进行累加求和，continue 之后的语句“nSum += i;”在 i 等于 50 时没有执行。因此整个循环在遍历 1…100 时过滤了数值 50，累加的结果为 5000，而不是 5050。

在介绍逗号表达式时曾说过，逗号表达式可以应用在 for 循环语句中。在计算 1…100 的累计求和运算中，如果使用一个循环变量，需要循环 100 次，如果我们采用两个循环变量，分别遍历“1…50”和“100…51”，则只需要 50 次循环就可以了。观察如下代码。

使用逗号表达式

int main(int argc, char* argv[])

{

int nSum = 0; //定义一个变量，记录累加的结果

for(int i=1, int j = 100; i<50, j>50; i++,j--) //在 for 语句中定义两个循环变量

{

nSum += i + j; //累加求和计算

}

cout << "结果: " << nSum << endl; //输出结果

return 0;

}

运行程序，效果如图 3 所示。

图 3 逗号表达式在 for 语句中的应用

在 for 语句中利用逗号表达式定义了两个循环变量 i 和 j，在循环条件部分判断 i<50 和 j>50，注意，由于逗号表达式的结果是第 2 个表达式的结果，因此循环条件 “i<50, j>50” 中“i<50”是没有意义的，我们可以将“for(int i=1, int j = 100; i<50, j>50; i++,j--)”改写为“for(int i=1, int j = 100; j>50; i++,j--)”，其运行结果是相同的。在上面的代码中循环的条件是 j 大于 50，当 j 等于 51 时，当前已经循环了 50（100…51）次，因为 i<50 不作为循环条件，i 在循环 50 次之后值为 50。

在介绍 if 语句和 switch 语句时曾介绍了如果在 if 表达式或 switch 表达式中定义变量，则变量只在 if 语句块和 switch 语句块中可用。那么在 for 语句中定义的循环变量，在 for 语句之外是否可用呢？

对于不同厂家的 C++编译器，处理该问题的结果会不同。在此我们使用的是微软 C++编译器，在微软的 C++编译器中，在 for 语句中定义的循环变量，它的作用范围直到包含 for 语句的复合语句或函数结束。也就是说，在 for 语句结束后，我们仍然可以使用循环变量。例如：

循环变量的作用范围

int main(int argc, char* argv[])

{

int nSum = 0; //定义一个变量，记录累加的结果

for(int i=1; i<101; i++) //定义循环变量 i

{

nSum += i ; //累加结果

}

cout << "循环变量 " << i << endl; //在 for 语句之外访问循环变量 i

cout << "结果: " << nSum << endl; //输出信息

return 0;

}

如果我们将循环语句放置在复合语句中，则在复合语句中可以访问循环变量，但是在复合语句之外是不能访问循环变量的。例如：

int main(int argc, char* argv[])

{

{ //复合语句开始

int nSum = 0;

for(int i=1; i<101; i++)

{

nSum += i ;

}

cout << "循环变量 " << i << endl; //能够访问循环变量 i

cout << "结果: " << nSum << endl;

} //复合语句结束

cout << "循环变量 " << i << endl; //非法的语句，不能访问循环变量 i

return 0;

}