C Primer Plus(6) 中文版 第6章 C控制语句:循环 6.5 for循环

发布于:2023-01-15 ⋅ 阅读:(183) ⋅ 点赞:(0)

6.5 循环
for循环把初始化、测试和更新组合在一起。
// sweetie2.c -- a counting loop using for
#include <stdio.h>
int main(void)
{
    const int NUMBER = 22;
    int count;
    
    for (count = 1; count <= NUMBER; count++)
        printf("Be my Valentine!\n");
    
    return 0;

/* 输出:

*/

关键字for后面的圆括号有3个表达式,分别用分隔分号隔开。第1个表达式是初始化,只会在for循环开始时执行一次。第2个表达式是测试条件,在执行循环之前对表达式求值。如果表达式为假,循环结束。如果表达式为真,则执行for语句中的单独语句。第3个表达式执行更新,在每次循环结束时求值。完整的for语句还包括后面的简单语句或复合语句。for圆括号中的表达式也叫做控制表达式,它们都是完整表达式,所以每个表达式的副作用都发生在对下一个表达式求值之前。
/* for_cube.c -- using a for loop to make a table of cubes */
#include <stdio.h>
int main(void)
{
    int num;
    
    printf("    n   n cubed\n");
    for (num = 1; num <= 6; num++)
        printf("%5d %5d\n", num, num*num*num);
    
    return 0;

/* 输出:

*/ 

6.5.1 利用for的灵活性
for循环还有其他9种用法。
*可以用于递减运算符来递减计数器;
/* for_down.c */
#include <stdio.h>
int main(void)
{
    int secs;
    
    for (secs = 5; secs > 0; secs--)
        printf("%d seconds!\n", secs);
    printf("We have ignition!\n");
    return 0;

/* 输出:

*/ 

*可以让计数器递增2、10等;
/* for_13s.c */
#include <stdio.h>
int main(void)
{
    int n;        // count by 13s from 2
    
    for (n = 2;  n < 60; n = n + 13)
        printf("%d \n", n);
    return 0;
}

/* 输出:

*/

*可以用字符代替数字计数;
/* for_char.c */
#include <stdio.h>
int main(void)
{
    char ch;
    
    for (ch = 'a'; ch <= 'z'; ch++)
        printf("The ASCII value for %c is %d.\n", ch, ch);
    return 0;
}

/* 输出:

*/

*除了测试迭代次数外,还可以测试其他条件。
for( num = 1; num <= 6; num++ )
替换成:
for( num = 1; num * num * num <= 216; num++ )
*可以让递增的量几何增长,而不是算术增长。也就是说,每次都乘上而不是加上一个固定的量:
/* for_geo.c */
#include <stdio.h>
int main(void)
{
    double debt;
    
    for (debt = 100.0; debt < 150.0; debt = debt * 1.1)
        printf("Your debt is now $%.2f.\n", debt);
    return 0;
}

/* 输出:

*/

*第3个表达式可以使用任意合法的表达式。无论是什么表达式,每次迭代都会更新该表达式的值。
/* for_wild.c */
#include <stdio.h>
int main(void)
{
    int x;
    int y = 55;
    
    for (x = 1; y <= 75; y = (++x * 5) + 50)
        printf("%10d %10d\n", x, y);
    return 0;

/* 输出:

*/

*可以省略一个或多个表达式(但是不能省略分号),只要在循环中包含能结束循环体的语句即可。
/* for_none.c */
#include <stdio.h>
int main(void)
{
    int ans, n;
    
    ans = 2;
    for (n = 3; ans <= 25; )
        ans = ans * n;
    printf("n = %d; ans = %d.\n", n, ans);
    return 0;
}

/* 输出:

*/ 

*第1个表达式不一定是变量赋初值,也可以使用printf()。记住,在执行循环的其他部分之前,只对第1个表达式求值一次或执行一次。
/* for_show.c */
#include <stdio.h>
int main(void)
{
    int num = 0;
    
    for (printf("Keep entering numbers!\n"); num != 6;  )
        scanf("%d", &num);
    printf("That's the one I want!\n");
    return 0;
}

/* 输出:

*/

*循环体中的行为可以改变循环头中的表达式。
for( n = 1; n < 10000; n = n + delta )
如果程序经过几次迭代后发现delta太小或太大,循环中的if语句可以改变delta的大小。在交互式程序中,用户可以在循环运行时改变delta的值。这样做也有危险的一点,例如,把delta设置为0就没用了。
总而言之,可以自己决定如何使用for循环头中的表达式,这使得在执行固定次数的循环外,还可以做更多的事情。 
小结:for语句
关键字:for
一般注解:
for语句使用3个表达式控制循环过程,分别用分号隔开。initialize表达式在执行for语句之前只执行一次;然后对test表达式求值,如果表达式为真(或非零),执行循环一次;接着对update表达式求值,并再次检查test表达式。
形式:
for( initialize; test; update )
    statement

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到