3.8、for循环

By | 2015年11月8日

在c语言中,一共有3种循环结构,一种是我们已经学习了的while,其他两种则是for和do…while

前者是我们今天学习的对象。

相比简洁的while结构

while(expression)

{

}

for结构要复杂一些,它的括号内有3个表达式(expression)

for(expression1; expression2; expression3)

{

}

第一个表达式(expression1)

会在进入for循环前开始执行,也就是说,它只会执行一次,因此它多用于一些初始化工作。

如果你用不到它,你可以将它空起来如for(; expression2; expression3),注意,分号是不能省略的(为什么请自己思考)

中间的表达式2,则类似于while中的表达式,它将用于判断是否进行本次循环

当结果为真时,它将进行本次循环,否则,将跳出循环

第三个表达式,则会在每次循环体完成后,下一次循环开始前执行

是不是有些糊涂了?没关系,代码才是描述编程的最好语言。

下面这个代码来自3.3、while循环一节,这里我们将它改为for版本

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int i = 0;
    while (i <= 100)
    {
        printf("%d\n", i);
        i = i + 1;
    }
    return 0;
}

for 版本

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int i = 0;
    for (; i <= 100; i = i + 1)
    {
        printf("%d\n", i);
    }
    return 0;
}

不出意外的话,这两个程序的执行效果是一样的

我们将i增加1的工作放到了expression3的位置,而由于expression1 的位置没有操作,因此我们将它空起来了

我们发现,在进行循环前,我们定义了一个变量i并且将它初始化为0,而expression1也会在进入循环之前执行一次,因此我们可以把第六至七行改为(我们使用了++运算符来实现自增)

int i;

for(i = 0; i <= 100; i++)

在c99和以后的标准中,我们可以在expression1的地方定义变量(在此之前是不允许的,因此我们还可以这样写)

for(int i = 0; i <= 100; i++)

这样,i就是一个名副其实的“循环变量”了,因为它决定了循环是否继续,而且在循环外它是无效的!

在for结构中定义的变量 作用域 是循环内部,在循环外部的任何地方都是不可见而且无效的,因此你可以在多个并列的for循环中定义同一个名字的变量,例如i

如果我们将这个循环展开,它是这样运行的(应该有助于你弄清循环的过程)

  1. 进入main函数
  2. 定义变量i,并初始化为0
  3. 判断i <= 100是否成立(显然成立)
  4. 进入循环体,执行printf();
  5. 退出循环体,执行i++
  6. 判断i<=100是否成立(此处i为1,成立)
  7. 进入循环体,执行printf();
  8. …….
  9. 退出循环体,执行i++(i=100,执行后i=101)
  10. 判断i<=100是否成立(不成立)
  11. 退出循环

在for的第三个表达式中执行对于那些控制循环的变量的操作是一个比较好的决定,因为这样我们就可以在循环体中只关注我们真正需要干的事(这个程序中是输出),从而使得程序结构更加清晰。

对于for,就这么多东西要说,如果你已经掌握了while,那么理解for起来也是比较轻松的

可能会有些人纠结:在啥时候用while,啥时候用for?

答案就是在你想用while的时候用while,在你想用for的时候用for

因为这两种循环都是可以相互转换的,就像你可以选择爬楼梯还是乘电梯上楼一样

最后,留下一个练习,请将下面的while循环改为for循环(其实就是3.3里面的代码啦)

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    double Fahrenheit = 0, Celsius = 0;
    printf("摄氏度\t华氏度:\n");
 
    while (Fahrenheit <= 100)
    {
        Celsius = (Fahrenheit - 32)/1.8;   //将华氏度换算成摄氏度
        printf("%.2f\t%.2f\n", Fahrenheit, Celsius);
        Fahrenheit = Fahrenheit + 10;
    }
    return 0;
}

发表评论

邮箱地址不会被公开。 必填项已用*标注