zoukankan      html  css  js  c++  java
  • 『C程序设计』读书笔记系列文章之第五章 循环控制

    一、几种循环语句

    1)goto语句
       学过 BASIC 或 FORTRAN 的人一定都用过 goto 语句,这个语句在 C 里面同样可以使用。不过,C 不提倡使用 goto 语句,因为 C 完全可以不用它,而滥用它往往会导致程序凌乱不堪、难以阅读和维护。当然,适当地使用 goto 语句也会使程序更加简洁。

      goto 语句的作用是跳转到一条你指定的语句,然后从那条语句开始往下执行。goto 语句的用法很简单,首先在你想要跳往的语句前面加个标签和冒号:

            to: printf("go to here\n");

    注意,标签的命名需要符合标识符命名规则

      然后,当你想跳转到该条语句时,使用“goto 标签名;”即可:

            goto to;

      通常,能避免 goto 都应该尽量避免。但是,如果是在陷入了很深层次的循环里想要跳出最外层的循环,用 goto 直接跳出却比用 break 一个循环一个循环地跳出要好得多。例如:

            while ( condition1 )
            {
                // ... ...
                while ( condition2 )
                {
                    // ... ...
                    while ( condition3 )
                    {
                        // ... ...
                        while ( condition4 )
                        {
                            // ... ...
                            goto out_of_loop;
                        }
                    }
                }
            }
            out_of_loop:
            // 其它语句

      还有,在深层循环里,如果想跳过余下的语句,直接返回第一层循环,使用 goto 语句也可以大大减少代码量:

            while ( condition1 )
            {
                // ... ...
                while ( condition2 )
                {
                    // ... ...
                    while ( condition3 )
                    {
                        // ... ...
                        while ( condition4 )
                        {
                            // ... ...
                            goto end_of_outmost_loop;
                        }
                    }
                }
            end_of_outmost_loop: ;
            }

      总之,goto 可以用,但不能滥用,使用前请务必三思。其实,你可以将 break 和 continue 理解成弱化了的 goto 语句。而我们上面所举的两个例子可以理解成强化了的 break 和 continue。

    2)while语句 先判断表达式后执行语句

        while 循环的使用方法为:

            while ( condition )
                一条语句

    如果 condition 为(true),则循环执行“一条语句”;如果 condition 为(false),则不执行“一条语句”,并退出循环。C 语言中,0 为假,非零为真。也就是说,如果 condition 的值为 0,则 condition 为假;否则,condition 为真。

        while 循环也可以这么用:

            while ( condition )
            {
                一系列语句
            }

    如果 condition 为真(true),则循环执行大括号中的一系列语句;反之,不执行大括号中的一系列语句,并退出循环。

    3)do-while语句 先执行语句后判断表达式
    do-while结构如下:
    do
    {
    一系列语句
    }while(condition)

    先执行do块中的语句,然后判断条件,如果符合再循环,不过不符合则不再执行下一次,退出循环。

    4)for语句

        for 循环的结构如下:

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

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

      一般而言,如果一个循环在第一次进入循环体之前需要对某个(些)变量赋初值,并且在每次循环体结束后都要改变这个(些)变量的值,我们习惯上会使用 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 为假则退出循环。


    二、Break语句和continue语句

      简单地说,Break语句用于跳出循环,continue用于结束本次循环。
      break语句
      break语句只能用在switch 语句或循环语句中, 其作用是跳出switch语句或跳出本层循环,转去执行后面的程序。由于break语句的转移方向是明确的,所以不需要语句标号与之配合。break语句的一般形式为: break; 上面例题中分别在switch语句和for语句中使用了break 语句作为跳转。使用break语句可以使循环语句有多个出口,在一些场合下使编程更加灵活、方便。

      continue语句
      continue语句只能用在循环体中,其一般格式是:

    continue;

      其语义是:结束本次循环,即不再执行循环体中continue 语句之后的语句,转入下一次循环条件的判断与执行。应注意的是, 本语句只结束本层本次的循环,并不跳出循环。
    下面看几个例子:

    void main(){
     int n;
     for(n=7;n<=100;n++)
     {
      if (n%7!=0)
       continue;
      printf("%d ",n);
     }
    }

      输出100以内能被7整除的数。

    int n;
    for(n=7;n<=100;n++)
    {
     if (n%7!=0)
      continue;
     printf("%d ",n);
    }

      本例中,对7~100的每一个数进行测试,如该数不能被7整除,即模运算不为0,则由continus语句转去下一次循环。只有模运算为0时,才能执行后面的printf语句,输出能被7整除的数。

    #include"stdio.h"
    void main(){
     char a,b;
     printf("input a string:\n");
     b=getchar();
     while((a=getchar())!='\n'){
      if(a==b){
       printf("same character\n");
       break;
      }b=a;
     }
    }

      检查输入的一行中有无相邻两字符相同。

    char a,b;
    printf("input a string:\n");
    b=getchar();
    while((a=getchar())!='\n'){
     if(a==b){
      printf("same character\n");
      break;
     }b=a;
    }

      本例程序中,把第一个读入的字符送入b。然后进入循环,把下一字符读入a,比较a,b是否相等,若相等则输出提示串并中止循环,若不相等则把a中的字符赋予b,输入下一次循环。

      输出100以内的素数。素数是只能被1 和本身整除的数。可用穷举法来判断一个数是否是素数。

    void main(){
     int n,i;
     for(n=2;n<=100;n++){
      for(i=2;i<n;i++)
       if(n%i==0) break;
       if(i>=n) printf("\t%d",n);
      }
     } int n,i;
     for(n=2;n<=100;n++){
      for(i=2;i<n;i++)
       if(n%i==0) break;
       if(i>=n) printf("\t%d",n);
    }

      本例程序中,第一层循环表示对1~100这100个数逐个判断是否是素数,共循环100次,在第二层循环中则对数n用2~n-1逐个去除,若某次除尽则跳出该层循环,说明不是素数。 如果在所有的数都是未除尽的情况下结束循环,则为素数,此时有i>=n, 故可经此判断后输出素数。然后转入下一次大循环。实际上,2以上的所有偶数均不是素数,因此可以使循环变量的步长值改为2,即每次增加2,此外只需对数n用2~n去除就可判断该数是否素数。这样将大大减少循环次数,减少程序运行时间。

    #include"math.h"
    void main(){
     int n,i,k;
     for(n=2;n<=100;n+=2){
      k=sqrt(n);
      for(i=2;i<k;i++)
       if(n%i==0) break;
       if(i>=k) printf("\t%2d",n);
     }

  • 相关阅读:
    SVN 使用教程
    MVC图片上传压缩
    MVC 上传下载压缩
    C# WinForm生成二维码,一维码,条形码 操作
    C#MVC生成二维码
    ajax post方式提交到.net core api
    .net core多文件上传 日志记录
    C# .net Core 文件上传
    C#.netmvc单文件上传 ajax上传文件
    详细的sql语句
  • 原文地址:https://www.cnblogs.com/michaelxu/p/1156936.html
Copyright © 2011-2022 走看看