『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);
 }

原文地址:https://www.cnblogs.com/michaelxu/p/1156936.html