当前位置:网站首页>>电脑技术>>C、C++语言>>我的著作 双击自动滚屏
C语言速成(第三章 程序控制语句)

发表日期:2006年1月1日      已经有9318位读者读过此文

第三章  程序控制语句

    C语言具有描述各种控制结构的能力,如分支结构、循环结构、分程序结构等等。如何利用这种能力来确定运算的次序和控制程序的走向,是本章要介绍的内容。在介绍这些内容之前,需要说明一下C语言的语句概念。C语言的大多数语句是表达式语句,即在一个表达式后面加上作为结束符的分号,就构成一条单独的语句。除单个语句之外它的表现形式还有:只有分号构成的、不执行任何任务的空语句以及用一对花括号括起来的一系列说明和语句组成的语句块(一般称之为复合语句)。如果复合语句中包含了变量或函数的说明,则又称其为分程序结构。它和分支结构、循环结构一样是程序控制语句的一个组成部分。下面对这些程序控制语句进行具体介绍。

第一节  条件分支语句

    条件分支语句的作用是,根据给定的条件进行判断并选择程序下一步的执行方向。在C语言中,通常用真假值来作为条件测试的依据,真值是指包括负数在内的任意非零值,假值则专门指零。C语言的这种真假值的处理方法不仅使编程变得简洁,同时提高了执行程序的编码效率。

    一、if~else语句

    if~else是条件分支语句的标准使用形式,它的一般格式为:

    if(表达式)  语句1  else  语句2

    执行if~else语句时,先计算表达式的值,若结果为非零值(真值)时,执行语句1,而跳过语句2;反之,即结果值为0时,则跳过语句1,直接去执行语句2。也就是说在这种分支语句里,不论表达式运算的结果如何,两个语句中只有一个被执行。如:

    例3.1  根据键盘输入值来返回相应代码的例程。

    #include <stdio>                  /* 以流为基础的输入输出函数说明 */

    yn()                              /* 接收键盘输入值并返回相应的代码 */
    {
    char ch;                         /* 存储输入字符变量 */
    ch=getchar();                    /* 接收键盘输入字符 */
    printf("%c",ch);                /* 显示键盘输入字符 */
    if(ch==''''y''''||ch==''''Y'''')  return(1); /* 若输入Y则返回l */
    else return(0);                  /* 否则返回0 */

    在该例中,用if语句判断输入的字符是否为y或Y,是就向调用处返回1,否则返回0。

    二、if语句

    if语句是if~else分支语句缺省else时的特殊情况,它的格式为:

    if(表达式)  语句1

    执行if语句时,先计算表达式的值,若表达式为真(非零),就执行语句1;反之就跳过语句1,而执行其下一语句。语句l可以是简单语句,也可以是复合语句。如:

    例3.2  求出并显示l~100之间能被39整除的数。

    #include<stdio.h>                  /* 以流为基础的输入输出函数说明 */
    main()
    {
    int;                              /* 循环计数变量 */
    for(i=1;i<=100;i++)             /* 从1~100循环 */
      {
      if((i%39)==0)                   /* 若i能被39整除 */
      printf("%d\n",i);               /* 显示i的值 */
    运行结果是在屏幕上输出39和78两个数。
    对逻辑表达式仅测试它的数值是零还是非零的if语句,还可采取简写形式,如在例3.2中,可将if语句改为if(!(i%39)),程序的运行结果是一样的。

    三、条件分支语句的嵌套

    条件分支语句可以嵌套使用。嵌套使用的格式如下:

    if(表达式1)
    if(表达式2)  语句1
    else  语句2
    当满足两个表达式(即两式都为非零)时,才执行语句1,跳过语句2;当仅满足前一个表达式时,则执行语句2,跳过语句1;当不满足前一个表达式时,就跳过语句1和语句2。C语言中对else语句有一个约定,在if语句嵌套时,elsc语句与其前面最接近的不带else语句的if相匹配。如要求出并显示1~100之间能被3和7整除的数,可编制以下一段程序:

    例3.3  求出并显示1~100之间能被3和7整除的数。

    #include <stdio.h>                 /* 以流为基础的输入输出函数说明 */

    main()
    {
    int;                                   /* 循环计数变量 */
    for(i=1; i<=100;i++)                  /* 从1~100循环 */
      {
      if(!(i%3))                           /* 若i能被3整除 */
      if(!(i%7))                           /* 若i能被7整除 */
        printf("%d 能被3和7整除.\n",i);  /* 显示能被3和7整除的i值 */
      else printf("%d 能被3整除不能被7整除.\n",i);
                                   /* 显示能被3整除不能被7整除的i值 */
      }
    }
    运行结果是在屏幕上将能被3和7整除以及能被3整除不能被7整除的数分行输出。
    如果希望else语句与前一个if相匹配,可使用花括号来实现。如上例要这样做则可取成如下形式:

    #include<stdio.h>                   /* 以流为基础的输入输出函数说明 */

    main()
    {
    int i;                                      /* 循环计数变量 */
    for(i=1;i<=100;i++)                         /* 从1~100循环 */
      {
      if(!(i%3))                                /* 若i能被3整除 */
        {
        if(!(i%7))                              /* 若i能被7整除 */
          printf("%d 能被3和7整除。\n",i);    /* 显示能被3和7整除的i值 */
        }
        else printf("%d 不能被3和7整除。\n",i);/* 不能被3和7整除i值 */
        }
      }

    它的运行结果是在屏幕上将能被3和7整除以及不能被3和7整除的数分行输出。显然,这与不加花括号时的情况大不相同。因此,在使用if语句的嵌套结构时,一定要遵守c语言的这种约定,以避免发生错误。保证不出现这类错误是程序设计人员的责任,c语言编译系统不查找和处理这类问题。

    四、多重条件语句

    多重条件语句是指在else后面的语句本身又是一个条件语句,其一般使用格式如下:

    if(表达式1)  语句l
    else if(表达式2)  语句2
    else if(表达式3)  语句3
    ......
    else 语句n

    该语句执行时从上往下进行检测,当其中有一个条件为真(非零值)时,与此条件有关的语句就被执行,而该多重条件语句中的其余部分就被越过。如果所有条件都不符合,那么最后一个else语句将被执行,这时如果最后一个else语句缺省,则该多重条件语句就不进行任何操作。
    多重条件语句主要用于多分支的处理,是程序编写中进行多路选择的常用方法。一个常被人们引用的典型例子是如下的整数四则运算程序。

    例3.4  先从键盘输入两个数,再输入四则运算符“+”、“-”、“*”、“/”中的一个,接着程序对它们进行运算并显示结果。若输入运算符号出现错误时,屏幕显示出错误信息。

    #include<stdio.h>                      /* 以流为基础的输入输出函数说明 */

    main()
    {
    int a,b,c;                           /* 供计算用的整数型变量 */
    printf("请输入第一个整数:a=");        /* 显示输入提示信息 */
    scanf("%d,&a);                         /* 接收键盘输入 */
    printf("请输入第二个整数:b=");
    scanf("%d,&b);
    getchar();                             /* 清除键盘缓冲区中的回车符 */
    printf("请输入四则运算符(+,-,*,/):");
    c=getchar();                           /* 接收键盘输入四则运算符 */
    if(c==''''+'''')
      printf("a+b=%d\n",a+b);              /* 根据输入的运算符判断输出结果 */
    else if(c==''''-'''')  printf("a-b=%d\n",a-b);
    else if(c=="*")  printf("a*b=%d\n",a*b);
    else if(c=="/")  plintf("a/b=%d\n",a/b);
    else printf("四则运算符输入错误!;%c\n",c);
    }

    若给该源程序取名ys.c,编译后生成ys.exe可执行文件,运行情况如下:

    C>ys<CR>
    请输入第一个整数:a=7  <CR>
    请输入第二个整数:b=49  <CR>
    请输入四则运算符(+,-,*,/):+  <CR>
    a+b=56

    该程序要求使用者先从键盘输入两个整数,然后输入四则运算符,如果输入正确.则显示运行结果。反之,则显示错误信息。

第二节  循环控制语句

    c语言的循环语句共有三个,即for语句、while语句和do~while语句。分别介绍如下:

    一、for语句

    for语句的一般格式为:

    for(表达式1;表达式2;表达式3)  循环体

    其中:表达式1用于进入循环之前给循环控制变量赋初值,它一般是赋值表达式,表达式2用来测试循环控制的条件,它一般是关系或逻辑表达式,表达式3用于循环后对循环变量的值进行变更,使其获得步进值或增量,它一般是赋值表达式,这三个表达式必须用分号隔开。循环体通常由一个简单语句或复合语句构成。
    该语句执行时.首先进行表达式1的运算,然后计算表达式2的值,若结果为真则执行循环体的语句,最后进行表达式3的运算,从而完成一次循环运行。下一次循环操作从计算表达式2的值开始,直到表达式2的计算结果为零(假)时循环结束。下面以一个显示大写英文字母表的程序为例来看一下for语句的应用。

    例3.5  显示大写英文字母表程序。

    #include <stdio.h>               /* 以流为基础的输入输出函数说明 */
    main()
    {    ,
    char i;                          /* 循环变量 */
    for(i=65;i<=90;i++)            /* 以A到Z字母的ASCII码进行循环 */
      {
      printf("%c  ",i);             /* 显示大写英文字母 */
      }
    }

    该程序执行时,首先进行表达式1的运算,将字母A的ASCII码赋予循环变量i,然后计算表达式2的值,若结果小于或等于字母Z的ASCII码则执行循环体的语句,即显示该ASCII码字母;最后进行表达式3的运算,将循环变量i加1,从而完成一次循环运行。接着又从计算表达式2的值开始,直到i大于字母Z的ASCII码值90时,循环结束。
    for语句还可同时对多个变量进行操作。如要求例3.5中显示大写英文字母时在字母前面再加上一顺序号,其程序可改成如下形式;

    例3.6  显示带序号的大写英文字母表程序。

    #include <stdio.h>                /* 以流为基础的输入输出函数说明 */

    main()
    {
    char i,j;                         /* 循环和序号计数变量 */
    for(j=1,i=65;i<=90;j++,i++)
                                      /* 以个到Z字母的ASCII码进行循环 */
      {
      printf("%d  %c  ",j,i);       /* 显示带序号的大写英文字母 */
      }
    }

    这种同时对变量i和j进行操作的编程,使得程序简便易读,代码简洁、高效。
    在for语句中,除分号不能省略外,任何一个表达式都可省略。如表达式1省略时,进入循环时不再给循环以初始条件,当表达式2省略时,循环控制条件的测试必须在循环体语句中进行;当表达式3省略时,循环变量的修改也必须在循环体语句中进行。下面我们用一个计算l~100之和的例子来编写如下三个等价的小函数:

    例3.7  计算1~100之和的例程之一。

    #include<stdio.h>               /* 以流为基础的输入输出函数说明 */

    main()
    {
    int i=1,j=0;                   /* 循环和计数变量赋初值 */
    for(;i<=100;i++)                /* 缺省表达式1状态的循环 */
      {
      j+=i;                         /* 将循环变量的值进行累加 */
      }
    printf("%d",j);                 /* 显示1~100之和 */

    例3.8  计算1~100之和的例程之二。

    #include<stdio.h>               /* 以流为基础的输入输出函数说明 */

    main()
    {
    int i,j=0;                     /* 循环和计数变量赋初值 */
    for(i=1;;i++)                   /* 缺省表达式2状态的循环 */
    {
    if(i>100)  break;               /* 若i大于100则中断循环 */
    j+=i;                           /* 将循环变量的值进行累加 */
    }
    primf("%d",j);                  /* 显示l~100之和 */

    例3.9  计算l~100之和的例程之三。

    #include<stdio.h>               /* 以流为基础的输入输出函数说明 */

    main()
    {
    int i,j=0;                      /* 循环和计数变量赋初值 */
    for(i=1; i<=lOO;)               /* 缺省表达式3状态的循环 */
      {
      j+=i;                         /* 将循环变量的值进行累加 */
      i++;                          /* 循环变量加1 */
      }
    printf("%d",j);                 /* 显示1~100之和 */
    }

    在for语句中,如果三个表达式都省略了,则该循环体习惯称之为无限循环,要使这种无限循环有实用价值,只有在循环体语句中使用goto、break、return等语句或者exit等库函数才能中止循环。用该方式编制与上面等价的例程如下:

    例3.10  计算1~100之和的例程之四。

    #include<stdio.h>               /* 以流为基础的输入输出函数说明 */

    main()
    {
    int i=1,j=0;                    /* 循环和计数变量赋初值 */
    for(;;)                         /* 进行无限循环 */
      {
      if(i>100)  break;             /* 若i大于100则中断循环 */
      j+=i;                         /* 将循环变量的值进行累加 */
      i++;                          /* 循环变量加1 */
      }
    printf("%d",j);                 /* 显示1~100之和 */
    }

    for语句的实际应用功能是很强的,这里只是为了说明问题而将其复杂的应用以简单的形式表现出来,因而很难体现它在编程应用中的优越性。读者在应用中可以去进一步的理解和发挥。

    二、while语句

    while语句又称之为前置条件循环语句。这是因为while在执行时首先要对测试条件进行检查,若循环条件不具备,它可以一次循环都不进行,虽然for语句也是如此,但下一小节将要介绍的后置条件循环语句do~while则并不这样运行,所以给while语句冠以“前置”二字。它的一般格式为:

    while(表达式)  循环体

   其控制循环的表达式可以是关系表达式也可以是逻辑表达式,当表达式的值为真(非零)时,则执行其后的循环体,否则就结束循环。循环体一般为简单语句或复句语句。下面用一个接收键盘输入字符的小程序为例介绍一下它的用法。

    例3.11  接收键盘输入字符,当输入的字符为小数点,并按回车时则退出循环,结束程序运行。

    #include<stdio.h>               /* 以流为基础的输入输出函数说明 */

    main()
    {
    char c=''''\0'''';                    /* 存储输入字符的变量 */
    while(c!=''''.'''')  c=getchar():    /* 接收键盘输入 */
    }

    若给该源程序取名sr.c编译后生成sr.exe可执行文件,运行时从键盘辖入“How are you?<CR>” 和“See you tomorrow.”两个英语短句时,屏幕显示如下内容:

    C>sr<CR>
    How are you?<CR>
    See you tomorrow.

    与for语句相似的是,语句while也可以通过将其控制循环的表达式简化为一个非零的常量来形成无限循环结构,如while(1),其作用和退出循环的方法均与for(;;)无限循环相同,这里不再赘述。

    三、do~while语句

    在上一小节中我们讲过do~while语句又称为后置条件循环语句,这是因为do~while在开始进入循环时并不先对测试条件进行检查,而不管循环条件具备与否,它首先执行循环体的操作,然后再进行循环控制条件判断。所以do~while语句至少要执行一次循环体。这是do~while语句与for语句和while语句的重要区别。它的一般格式为:

    do  循环体  while 表达式

    与while浯句相同,其控制循环的表达式可以是关系表达式也可以是逻辑表达式。循环体一般为简单浯句或复句语句.下面用一个求10的阶乘程序为例介绍一下它的用法。

    例3.12  求10!的程序。

    #include<stdio.h>              /* 以流为基础的输入输出函数说明 */

    main()
    {
    int a=1;                       /* 循环控制变量 */
    long b=1;                      /* 计数变量 */
    do {                           /* 进入阶乘运算的循环 */
      b*=a;                        /* 计数变量赋值 */
      a++;                         /* 循环变量加1 */
      }  while(a<10);              /* 测试并判断循环条件越界否 */
    printf("10!= %ld\n",b);        /* 显示10!的运算结果 */
    }

    若给该源程序取名jc.c,编译后生成jc.exe可执行文件,运行该程序结果为:

    C>jc <CR>
    10!=362880

    综上所述,循环语句的三种方式除共同之处外,还有一些不同点,主要是:
    1、在赋初值方面,do~while语句和while语句一般是在进入循环语句之前进行初始化,而for语句一般是在循环语句内进行初始化。
    2、在循环控制变量方面,do~while语句和while语句是在循环体内变化,而for语句一般是在循环语句中变化。
    3;在循环控制变量测试方面,do~while是先进行循环体操作,后进行循环控制变量测试。while语句和for语句都是先进行循环控制变量测试,后进行循环体操作。
    在实际使用中,如循环控制变量不需赋初值或要单独重赋值时,用while语句比for语句代码简洁,反之用for语句较好,尤其是在处理一维或多维数组元素时,用for语句更为方便。但由于它们的共同之处是主要方面,所以三者之间一般是可以相互替换使用的。

第三节  开关语句与跳转语句

    一、switch(开关语句)

    在本章的第一节我们介绍了如何使用if语句来解决多路选择问题,这里再介绍一个C语言中专门为了解决多路分支问题而提供的switch语句。它的一般格式为:

    switch(表达式)
    {
    case 判断值1:
             语句组1;
             break;
    case 判断值2:
             语句组2:
             break;
    ......

    case 判断值n:
             语句组n;
             break;
    default:
             语句组;
             break;
    }

    其中表达式可以是关系表达式也可以是逻辑表达式。其判断值一般需使用int类型的数据,且一个switch语句中的各case后面的判断值互不相同。语句组一般为单个语句或复合语句。该语句执行时先计算表达式,将表达式的值依次与case后的判断值逐个比较,当与某一判断值相符时就执行该判断值后的语句组;若与各判断值都不符,就执行default后面的语句组,如果default语句缺省,则该switch结构不再执行任何操作。而在语句组后面的break则是退出switch操作的语句,如果该语句缺省,则在执行某一csse语句之后,便继续执行下一case语句的语句组。下面列举一个用于菜单选择的开关语句例子来简单介绍一下其用法:

    例3.13  用于菜单选择的开关语句例程。

    #include<stdio.h>              /* 以流为基础的输入输出函数说明 */

    main()
    {
    char i;                        /* 计数变量 */
    printf("\n    1.文件排版    2.窄页打印\n");
    printf("\n    3.宽页打印    4.退出系统\n");
    printf("\n      请您选择=");  /* 显示菜单内容 */
    scan("%d",&i);                /* 接收用户选择的代码 */
    getchar();                    /* 清除键盘缓冲区中的回车符 */
    switch(i)                      /* 根据用户选择的代码进行分情况处理 */
      {
      case 1:  paib();  break;  /* 若用户选第一项则调paib函数运行 */
      case 2:  dand();  break;  /* 若用户选第二项则调dand函数运行 */
      case 3:  kdy();   break    /* 若用户选第三项则调kdy函数运行 */
      default: break;            /* 若用户选其它代码则跳出开关语句 */
      }
    printf("\n    再    见  !");   /* 显示程序运用结束信息 */
    }

    paib()                         /* 排版操作函数 */
    {
    printf("\n\07排版操作函数省略(按一键退出)\n");
    getchar();
    }

    dand()                         /* 窄页打印操作函数 */
    {
    printf("\n\07窄页打印操作函数省略(按一键退出)\n");
    getchar();
    }

    kdy()                          /* 宽页打印操作函数 */
    {
    printf("\n\07宽页打印操作函数省略(按一键退出)\n");
    getchar();
    }

    例3.13实际上已经具有一个应用程序的框架了,程序用printf函数在屏幕上显示出该程序的操作功能菜单并调用getchar函数来接收用户的选择,当用户选择完毕程序则根据选择的代码用开关语句进行分情况处理,将其依次与case后的判断码逐个比较,当与某一判断码相符时就执行该判断值后的语句组,语句组中又根据用户的选择再调用执行该功能的函数;若用户选择的值与各判断值都不相符(在这里是除1,2,3键码以外的键),就执行default后面的语句组。

    二、goto(无条件转移语句)

    尽管程序设计的方法学认为goto语句是一种有害的结构,但目前各种算法语言几乎都有无条件转移语句,C语言也不例外。其无条件转移语句的一般格式为:

    goto  标识符;

    执行goto语句能使程序执行转向同一函数内以goto后面的标识符为标号的语句.如:

    例3.14  在一个二维教组中查找某个整数,若找到就显示储存该元素的数组单元,若未找到则给出提示。

    #include<stdio.h>                  /* 以流为基础的输入输出函数说明 */
    main()
    {
    int i,j,k;                       /* 循环与计数变量 */
    int a[5][5];                       /* 存储数据的二维数组 */
    for(1=0;i<5;i++)  for(j=0;j<5;j++)  a[i][j]=i*j;
                                       /* 给二维数组赋值 */
    printf("请输入要查找的整数值:");  /* 显示输入提示信息 */
    scanf("%d",&k);                    /* 接收用户的键盘输入 */
    for(i=0;i<5;i++)                   /* 查找数据的外层循环 */
      {
      for(j=0;j<5;j++)                 /* 查找数据的内层循环 */
        {
        if(a[i][j]=k)  goto AAA;       /* 若查到需找数据则无条件转移到AAA处 */
        )
      }
    printf(" 该数组中没有您要查找的整数。\n");  exit(o);
                                       /* 若找不到则显示提示信息后退出 */
    AAA:  printf(" 您要查找的整数是:a[%d][%d]=%d\n",i,j,k);
                                       /* 如查到需找数据则显示结果 */

    若给该源程序取名csz.c,编译后生成csz.exe可执行文件,运行该程序结果为:

    C>csz<CR>
    请输入要查找的整数值:16
    您要查找的整数是:  a[4][4]=16

    从上例可以看出,使用goto语句能一下跳出多重循环。这在编程应用中是一种简单易行的方法。但在使用goto语句和标号语句时,需注意以下几点:
    1、语句标号可以和变量名相同,编译系统会自动区分它们,而不会引起混淆。但在c语言中,标号是属于全程的,所以主程序中使用的标号与函数中使用的标号不能重复。
    2、goto语句的目的地只能在同一函数内,也就是说goto的使用范围局部于函数。
    3、goto语句的转向虽然是任意的,但却不允许从循环语句的外部转向循环语句的内部,因为这样会使机器运行发生混乱。
    4。goto语句适用于跳出多重循环语句和无限循环语句。特别是在无限循环语句中经常使用它。在这样的情况下,能使程序可读性好,代码简洁。
    5、含有goto语句的程序一般都可以用不带goto语句的方法编写,所以C语言不提倡使用goto语句编程,但在会引起增加较多额外变量或需进行太多重复测试的时候,偶尔用一下也是可以的。

    三、break(中断语句)

    中断语句break既可终止开关语句switch的运行,又可迫使一个循环语句避开循环条件的测试立即退出循环操作。它的一般格式为:

    break;

    当程序执行到break语句时,就跳出开关或循环语句结构,使程序从它们之后的第一条语句起继续执行。但要注意的一点是,在多重循环内的break语句只能跳出其所在的那一层循环结构。也就是说要从几重循环中退出来就得使用几个break语句。鉴于我们在本章介绍循环语句的例3.8和例3.10中以及介绍开关语句的例3.13中都用到了该语句,所以关于break语句这里就不再重复举例了。

    四、continue(条件继续语句)

    执行条件继续语句continue时,程序将跳过从该语句起至循环结束前的语句,回到循环的条件测试部分运行。具体地说,在while语句和do~while语句中,执行continue语句使得程序直接回到循环控制变量的测试部分,然后继续下一次循环,对于for语句,则首先执行循环的增量部分(即表达式3),然后执行条件测试,最后继续循环。
    它的一般格式为:

    continue;

    现在我们将例3.3求出并显示1~100之间能被3和7整除的数的例程更改一个字,变为以下例3.15来说明continue的用法:

    例3.15  求出并显示1~100之间能被3或7整除的数。

    #include<stdio.h>        /* 以流为基础的输入输出函数说明 */

    main()
    {
    int i;                   /* 循环计数变量 */
    for(i=1;i<=100;i++)      /* 从1~100循环 */
      {
      if(!(i%3))
          /* 显示能被3整除的i值后不再判断能否被?整除就进行下一次循环 */
        {
        printf("%d 能被3整除。\n",i);
        continue;
        }
      if(!(i%7))  printf("%d 能被7整除。\n",i);
                             /* 显示能被7整除的i值 */
      else printf("%d 不能被3或7整除。\n",i);
                             /* 显示不能被3或7整除的i值 */
      }
    }

    五、return(返回语句)

    relurn语句也是具有控制程序走向能力的语句之一。因为c语言程序一般都是由一个主函数main和若干个子函数构成的,除主函数外,其它函数经常要通过return语句返回到它的调用处。它的一般格式为:

    return(表达式);

    其中表达式是返回的值。表达式外的圆括号可以省略,表达式本身也是任选项,即可以缺省,这时程序返回调用处运行,但不带回任何参数。如果一个不返回任何值的return语句处在函数的最后位置,则return本身也可省略。函数返回值的类型应与函数的类型相同,且只能返回一个数据或变量指针。因本书在第八章讲解函数的时候还要详细介绍这一语句,所以这里从略。

第四节  分程序结构语句

    在本章的开始部分我们曾提到过用一对花括号括起来的一系列说明和语句组成的语句块称之为复合语句。如果复合语句中包含了变量或函数的说明,则又称其为分程序结构。它和分支结构、循环结构一样是程序控制语句的一个组成部分。现具体说明如下:
    C语言的复合语句是由若干条说明和语句以花括号“{”和“}”  括起来构成的。但复合语句的闭花括号“}”后面不能有分号,这是与一般以分号结尾的语句不相同的。
    复合语句的执行按它的成员语句(即组成复合语句的各语句)顺序进行。程序中在可用语句的地方都可用一个复合语句来代替,而复合语句中的各成员语句本身又可能是复合语句。
    在复合语句中,如果有变量或函数的说明则要求出现在语句之前,这种称之为分程序的复合语句除了不能返回值等一些功能外,已具有了函数的大部分功能,所以是专业编程者非常喜用的一种编程方式。
    复合语句的一般形式是:

    {
    数据和函数说明部分
    执行语句部分
    }

    下面以一个判断输入的整数是否为素数的程序来将以上所述内容具体化:

    例3.16

    #include<stdio.h>              /* 以流为基础的输入输出函数说明 */
    main()
    {
    long j;                        /* 存储键盘输入数据变量 */
    scanf("%ld",&j);              /* 接收键盘输入 */
     {
     long i;                       /* 分程序中说明的计数变量 */
     for(i=2;i<j;i++)              /* 判断是否素数的循环 */
       {
       if(!(j%i))                  /* 如果该数能被1和它本身之外的数整除 */
         {
         printf("%ld  不是素数!\n\07",j);
                                   /* 显示该数不是素数的提示信息 */
         break                     /* 退出循环 */
         }
       }
     if(i==j)  printf("%ld 是素数!\n\07",j);
               /* 如果该数不能被1和它本身之外的数整除则显示是素数的信息 */
     }
    }

    若给该源程序取名ss.c,编译后生成ss.exe可执行文件,运行情况如下:

    C)ss <CR>
    121<CR>
    121不是素数!

    C)ss <CR>
    11<CR>
    11是素数!

    显然该程序只是为了说明复合语句的用法而特意这样编写的,因为这样的小程序完全用不着采用分程序结构的方式来说明i变量,但在中型以上规模的程序编制中,为了数据的安全而采用这种方式是很有必要的。


相关专题: 我的著作
专题信息:
  C语言速成(第七章 联合、枚举和自定义数据类型)(2006-1-1 13:51:46)[9923]
  C语言速成(第六章 结构)(2006-1-1 13:52:05)[8731]
  C语言速成(第五章 指针)(2006-1-1 17:28:54)[4478]
  C语言速成(第四章 数组)(2006-1-1 13:52:42)[4567]
  C语言速成(第二章 常量、变量、运算符与表达式)(2006-1-1 13:53:05)[7172]

相关信息:
 没有相关信息
  打印本页
设为首页 | 加入收藏 | 联系我们 | 管理入口
皖ICP备05018956号
Copyright © 2003 J.W.SHEN All Rights Reserved
后台管理系统 V1.0 制作