回首页 回首页 ◎ 设为首页  
◎ 收藏本站  
◎ 给我留言  
  
  首 页  C/C++教程  C++之父的FAQ  C/C++动向  C/C++源代码  C/C++误区  Unix/Linux  下载中心  乱七八糟  蚂蚁的Blog  
  当前位置:首 页 >> C/C++教程 >> C 语言基础教程 >> 40. for 循环
最 近 更 新
54. goto 语句
53. switch 语句推荐
52. continue 和 break
51. 条件运算符(?:)
50. if 语句嵌套推荐
49. 逻辑运算符推荐
48. 在循环中使用 if 语句推荐
47. if 和 else 连用推荐
46. if 语句
45. 循环应用实例 2
最 新 推 荐
53. switch 语句推荐
50. if 语句嵌套推荐
49. 逻辑运算符推荐
48. 在循环中使用 if 语句推荐
47. if 和 else 连用推荐
44. 循环应用实例 1推荐
43. 循环嵌套推荐
40. for 循环推荐
37. 关系运算符推荐
36. while 循环推荐
热 门 排 行
2. 第一个 C 程序推荐
31. 预处理指令 #define..推荐
1. C 语言简介
11. 基本数据类型:整型..推荐
24. 运算符的优先级和结..推荐
5. 如何编写函数
30. 字符串字面量推荐
13. 标识符命名规则
36. while 循环推荐
7. 第三个 C 程序推荐
站 内 搜 索

Web stdcpp.cn
关键词

搜索方式

搜索范围

精确匹配
广 告

40. for 循环


来源:蚂蚁的 C/C++ 标准编程 作者:antigloss 等级:精品
发布于2006-09-23 21:59 被读3952次 【字体:

    for 循环的结构如下:

        for ( 表达式1; 表达式2; 表达式3 )
            一条语句/复合语句

无论 for 循环到底会循环多少次,表达式1 都只会被运算一次——只有当 for 循环第一次执行时才会运算表达式1。表达式2 用于控制是否继续进行循环。如果表达式2 为真,则执行“一条语句/复合语句”,反之则退出循环。出于表达上的方便,我们把循环结构中的“一条语句/复合语句”称为循环体。在表达式2 成立的情况下,并且在循环体执行完毕后,表达式3 才会被运算。表达式3 运算完毕后,再次运算表达式2,若表达式2 为真,则再执行一次循环体,然后再运算表达式3,接着再测试表达式2 的真假性……如下图所示:

基于这些特性,表达式1 常用于对某个(些)变量赋初始值,表达式2 常用于测试这个(些)变量是否满足特定的条件,而表达式3 常用于更新这个(些)变量的值。例如:

        #define ARR_SIZE 10

        int i;
        int arr[ARR_SIZE] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        /* 输出数组中所有元素的值 */
        for ( i = 0; i < ARR_SIZE; ++i )
            printf("%d\n", arr[i]);

上例中的 i = 0 只会被运算一次;仅当 i < ARR_SIZE 为真时才会进入循环体;循环体完成一次执行后才运算 ++i,接着再判断 i < ARR_SIZE 的真假性……每次进入循环体之前都要先判断 i < ARR_SIZE 的真假,如果第一次判断其真假性时就发现其为假,则循环体一次也不会被执行,也不会运算 ++i。

    for 循环能做的,改用 while 循环也可以实现。与上面的 for 循环等价的 while 循环是:

        i = 0;
        while ( i < ARR_SIZE )
        {
            printf("%d\n", arr[i]);
            ++i;
        }

不过相比之下,在这种情况下,使用 for 循环要比 while 循环简练。

    同理,while 循环能做的,for 循环也能胜任:

        int guess = 0;
        while ( guess != 567 )
        {
            printf("Guess what I am: ");
            scanf("%d", &guess);
        }

等价的 for 循环为:

        int guess = 0;
        for ( ; guess != 567; )  // 这里看不懂没关系,后面会讲到
        {
            printf("Guess what I am: ");
            scanf("%d", &guess);
        }

不过相比之下,这里使用 while 循环看起来会比较舒服。

    一般而言,如果一个循环在第一次进入循环体之前需要对某个(些)变量赋初值,并且在每次循环体结束后都要改变这个(些)变量的值,我们习惯上会使用 for 循环;如果一个循环不需要对变量赋初值,也不需要在每次循环体结束后都改这个(些)变量的值,使用 while 循环会更自然一点。

    for 循环中的表达式1、表达式2 和表达式3 可以是任何合法的表达式,也可以省略。你可以省略这三个表达式中的任意一个或者两个甚至全部省略,不过分号(;)不能省略!注意,这里的 ; 不是语句结束标志,而是分隔符。如果省略表达式2,则表明这个 for 循环是一个无条件无限循环:

        /* 无限循环 */
        for ( i = 0; ; ++i )
        {
            /* something here */
        }

上面这个 for 循环,i = 0 首先被运算一次,然后无条件进入循环体,执行完一次循环体后,接着运算 ++i,然后又再无条件执行循环体……

        /* 全部省略,当然也是无限循环 */
        for ( ; ; )
        {
            /* something here */
        }

上面这个 for 循环,把所有三个表达式都省略了,不用说当然是无限循环。

        /* 省略表达式1 */
        for ( ; i != 10; ++i )
        {
            /* something here */
        }
       
上面这个 for 循环,省略了表达式1,一开始执行时就判断 i != 10 是否为真,如果为真,则进入循环体,执行完一次循环体后,接着运算 ++i,然后再判断 i != 10 的真假性……如果 i != 10 为假则退出循环。

    总之,for 循环是按照前面图示的顺序执行的,当然我们也可以根据实际情况省略那三个表达式中的任何表达式。这三个表达式都是完全表达式,所以它们之中任何一个表达式运算结束时,该表达式的所有副作用就都已经结束了。

    前面讲逗号运算符时,曾经说过逗号运算符通常配合 for 循环使用,下面我们来看一个例子:

        int i, j, limit;

        scanf("%d", &limit);
        for ( i = 0, j = 0; i <= limit; ++i, j = j + 2 )
        {
            /* ... ... */
        }

上例通过使用逗号运算符,在表达式1 中对多个变量赋初值,在表达式3 中修改多个变量的值。这是逗号运算符配合 for 循环使用时最常见的用法。

    for 循环使用起来灵活多变,特别是配合逗号运算符使用时更是变幻无穷!以上列举的仅仅是 for 循环最常见的用法。

参考资料:C Primer 5th Edition
          The C Programming Language 2nd Edition
          C99 标准

本文版权归 蚂蚁的 C/C++ 标准编程 以及 作者 antigloss 共同所有,转载请注明原作者和出处。谢谢。



相关专题:C 循环语句
45. 循环应用实例 2
44. 循环应用实例 1

上一篇:39. 逗号运算符
下一篇:41. do while 循环

共有评论 6 条 网友评分 4分 查看全部评论

游客:亲切亲切
评分:0
看不洞
游客:antigloss
评分:0
请问那里看不懂呢?
游客:yikeshu
评分:5
antigloss赶紧写啊,我差不多看完了
游客:chaifengdi
评分:0
这个前面的第一个程序中的预处理#define ARR_SIZE 10; 可不可以用_const ARR_SIZE=10代替呢
游客:chaifengdi
评分:0
C语言中,如果不设定初始值,比如i那么i在后面的运算中,I的值是不是0呢,如i=i+i 那么I的值是不是0呢
游客:antigloss
评分:0
亲自尝试一下就知道了

查看全部评论

【发表评论】 评分:1分 2分 3分 4分 5分


验证码:

Powered By Www.Xydw.COM Ver1.14 管理
Copyright © 2005-2006 蚂蚁的 C/C++ 标准编程 All Right Reserved. XCMS
粤ICP备06014124号   站长:Antigloss