首页 > 编程笔记 > C语言笔记 阅读:11

C语言for循环用法详解(附带实例)

C语言中,使用 for 语句也可以控制一个循环,并且在每次循环时修改循环变量。

在所有循环语句(while、do while 和 for)中,for 语句的应用最为灵活,可以用于循环次数确定的情况,还可以用于循环次数不确定但给出了循环结束条件的情况。

for 语句的一般形式如下:
for(表达式1;表达式2;表达式3)
{
    语句块(循环体)
}
每条 for 语句包含 3 个用分号隔开的表达式。这 3 个表达式用一对圆括号括起来,其后紧跟着循环语句或语句块。当执行到 for 语句时,程序首先计算第 1 个表达式的值,接着计算第 2 个表达式的值。如果第 2 个表达式的值为真,程序就执行循环体的内容,并计算第 3 个表达式;然后检验第 2 个表达式,执行循环;如此反复,直到第 2 个表达式的值为假,退出循环。

for 语句的执行流程如下图所示:


图 1 for语句的执行流程图

其执行过程如下:
for 语句的形式也可以简单表示为:
for(循环变量赋初值;循环条件;循环变量改变)
{
    语句块
}

例如,实现一个循环输出操作:
for(i=1; i<100; i++)
{
    printf("%d",i);
}
在上面的代码中:
一次循环完成后,会再次判断表达式“i<100”的状态,为真时,继续执行语句块;为假时,循环结束,执行后面的程序代码。

使用 for 语句时,常常犯的错误是将 for 语句括号内的表达式用逗号隔开。例如:
for(i=1,i<100,i++) {...}
这句代码就是错误的。切记,3 个表达式之间应用分号隔开。

【实例】计算小球反弹高度。一个球从 80 米高度自由落下,每次落地后反弹的高度为原高度的一半,计算小球第 6 次反弹的高度。在本实例中,要求使用 for 循环语句计算小球反弹高度。具体代码如下:
#include <stdio.h>
int main()
{
    int high  =80; /*定义变量 high,表示高度*/
    int i; /*定义变量 i,作为循环变量*/
    for(i = 0; i < 6; i++) /*使用 for 语句循环*/
    {
        high /= 2; /*每次反弹高度*/
        printf("当前高度是 %d\n", high); /*输出当前反弹高度*/
    }
    printf("第 6 次反弹高度 %d\n", high); /*输出第 6 次反弹高度*/
    return 0; /*程序结束*/
}

运行程序,结果为:

当前高度是 40
当前高度是 20
当前高度是 10
当前高度是 5
当前高度是 2
当前高度是 1
第 6 次反弹高度 1


for 循环的执行过程也可以使用 while 循环来表示:
表达式1;
while(表达式2)
{
    语句块
    表达式 3;
}
上面就是使用 while 循环表示 for 循环的一般形式,其中的 3 个表达式对应着 for 语句括号中的 3 个表达式。下面通过一个实例来比较一下这两种操作。

【实例】用 for 语句实现一个 n~100 循环累加的操作,再使用 while 语句实现相同的功能。注意观察实例中 for 语句中的表达式与 while 语句中的表达式所对应的位置。
#include <stdio.h>
int main()
{
    int n, sum = 0; /*定义变量 n 表示输入的数据,sum 表示累加和*/
    int i, n1, sum1 = 0; /*定义变量 n1 表示输入的数据,sum1 表示累加和*/
    printf("请输入一个自然数:"); /*提示输入自然数*/
    scanf("%d", &n1); /*输入数据 n1*/
    for(i = n1; i <= 100; i++) /*使用 for 循环计算累加和*/
    {
        sum1 = sum1 + i; /*进行累加*/
    }
    printf("结果为:%d\n", sum1); /*将结果输出*/

    printf("请输入一个自然数:"); /*提示输入自然数*/
    scanf("%d", &n); /*输入数据 n*/
    while(n <= 100) /*使用 while 循环计算累加和*/
    {
        sum = sum + n; /*进行累加*/
        n++; /*循环变量自增*/
    }
    printf("结果为:%d\n", sum); /*将结果输出*/
    return 0;
}

运行程序,结果为:

请输入一个自然数:1
结果为:5050
请输入一个自然数:2
结果为:5153

C语言for循环的变体

通过上面的学习可知,for 语句的一般形式中有 3 个表达式。这 3 个表达式都是必不可少的,还是可以根据情况进行省略呢?接下来对不同情况进行讲解。

1) for语句中省略表达式1

表达式 1 的作用是对循环变量设置初值,如果省略了表达式 1,就会影响对表达式 2(即循环条件)的判断。为保证程序正常运行,应在 for 语句之前先给循环变量赋值。

例如:
for(;iNumber<10;iNumber++)
注意,省略表达式 1 时,其后的分号不能省略,要格外注意。

【实例】根据用户输入的数据计算其阶乘,并且将 for 语句中第一个表达式省略。具体代码如下:
#include <stdio.h>
int main()
{
    int n, i = 1, result = 1; /*定义变量,为变量 i, result 赋初始值*/
    printf("请输入 n 的值:\n"); /*提示用户输入数据*/
    scanf("%d", &n); /*输入数据*/
    for(; i <= n; i++) /*for 循环,省略表达式 1*/
    {
        result *= i; /*计算阶乘*/
    }
    printf("%d!=%d\n", n, result); /*输出结果*/
    return 0; /*程序结束*/
}
在代码中可以看到,在定义 i 变量时直接为其赋了初值,这样在使用 for 语句循环时就不用再为 i 赋初值,从而可以省略表达式 1。

运行程序,显示效果为:

请输入 n 的值:
5
5!=120

在代码中可以看到,在定义 i 变量时直接为其赋了初值,这样在使用 for 语句循环时就不用再为 i 赋初值,从而可以省略表达式 1。

2) for语句中省略表达式2

表达式 2 给出的是循环条件,如果表达式 2 省略,则无法判断循环条件,也即默认表达式 2 始终为真,因此循环将无终止地进行下去。

例如:
for(iCount=1;iCount++) //缺少循环条件,循环条件一直为 true,陷入死循环
{
    sum=sum+iCount;
}

括号中,表达式“iCount=1”为赋值表达式,第二个表达式是空缺的,这样就相当于使用了如下 while 语句:
iCount=1;
while(1)
{
    sum=sum+iCount;
    iCount++;
}
可见,for 语句中表达式 2 是不能省略的。

3) for语句中省略表达式3

表达式 3 用于改变循环变量,可以省略,但此时程序设计人员应在循环体内增加类似功能的语句,以保证循环能正常结束,否则程序也会无终止地循环下去。

例如:
for(iCount=1;iCount<50;){
    sum=sum+iCount;
    iCount++;
}

for循环中的逗号应用

在 for 语句中,表达式 1 和表达式 3 处除了可以使用简单的表达式,还可以使用逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。

例如,在表达式 1 处为变量 iCount 和 iSum 设置初始值:
for(iSum = 0, iCount = 1; iCount < 100; iCount++) {
    iSum = iSum + iCount;
}
或者在表达式 3 处执行循环变量自加操作两次:
for(iCount = 1; iCount < 100; iCount++, iCount++) {
    iSum = iSum + iCount;
}

也就是说,表达式 1 和表达式 3 都可以是逗号表达式。在逗号表达式内按照自左至右顺序求解,整个逗号表达式的值为其最右边的表达式的值。例如:
for(iCount=1;iCount<100;iCount++,iCount++)
就相当于:
for(iCount=1;iCount<100;iCount=iCount+2)

【实例】在本实例中,为变量赋初值的操作都放在 for 语句中,并且对循环变量进行两次自加操作,这样所求出的结果就是所有偶数的和。
#include <stdio.h>
int main()
{
    int iCount, iSum; /* 定义变量 */
    /* 在 for 循环中,为变量赋值,对循环变量进行两次自增运算 */
    for(iSum = 0, iCount = 0; iCount <= 100; iCount++, iCount++)
    {
        iSum = iSum + iCount; /* 进行累加计算 */
    }
    printf("the result is: %d\n", iSum); /* 输出结果 */
    return 0;
}
在程序代码中,在 for 语句中对变量 iSum、iCount 进行初始化赋值。每次循环语句执行完后进行两次 iCount++ 操作,最后将结果输出。

运行程序,结果为:

the result is: 2550

注意,浮点值的误差是不可避免的,如果在 for 循环的条件表达式中使用浮点值,那么将导致数值错误。因此,建议开发者不要使用浮点类型定义 for 语句的循环变量。

相关文章