C 语言基础教程(我的C之旅开始了)[二]

3. C 程序的结构

C 程序由一个以上的函数组成,而且必须有 main 函数。此外,C 程序一般还有一些预处理指令。例如 #include 指令。当然并不是必须要有 #include 指令。函数由函数头和函数体组成。函数头由返回值、函数名以及参数列表(可以是void)组成。函数体从 { 开始,以 } 结束。函数体里可以有一系列的语句,每个语句以分号(;)结束。例如:

预处理指令     ——〉   #include <stdio.h>

函数头         ——〉  int main( void )
       函数体开始      ——〉  {
       变量声明语句    ——〉      int i;
       赋值语句        ——〉      i = 1;

函数调用语句    ——〉      printf( "%d\n", i );

return 语句     ——〉     return 0;
       函数体结束      ——〉  }

简而言之,一个简单的标准 C 程序的结构如下:

#include <stdio.h>/*非必须。若没用到stdio.h里声明的函数,则不需要*/

int main(void)
       {
           一系列语句

return 0;
       }








4. 第二个 C 程序

 

首先请看以下代码,并且和我们的第一个 C 程序比较比较,看看这个程序新增了什么知识点。

/* meter2centimeters.c -- 以厘米为单位来表示两米 */

#include <stdio.h>

int main(void)
     {
         int meters, centimeters;
         meters = 2;

centimeters = 100 * meters;  /* 100 乘以 meters */
         printf( "%d-meter is equal to %d centimeters.\n", meters, centimeters );
         printf( "Yes, I said %d centimeters!\n", 100 * meters );

return 0;
     }

下面我们来仔细分析这个小程序。

1. 文档
    这段代码头部的注释标明了文件名和程序的作用,我们把这些注释称为文档。写文档是一个很好的习惯,可以帮助我们了解程序的作用。在由多个源文件组成的程序中,文档显得更为重要。由于我们目前为止所写的都是很简单的程序,您也许还不觉得写文档有多大的作用,甚至还觉得浪费时间。但是我们应该养成写文档的习惯,这对我们以后写复杂的程序很有帮助。对于复杂程序,我们应该尽可能把文档写得更详尽。可以参考以下格式:
       /***************************************************
        *  文件名:               meter2centimeters.c
        *  作者:                  Antigloss  at  http://cpp.ga-la.com
        *  编写日期:            05-9-9 0:00
        *  最后修改日期:      05-9-9 0:00
        *  功能:                  以厘米为单位来表示两米
        *  算法:                  1 米 = 100 厘米
        **************************************************/

2. 多重声明
          int meters, centimeters;
    上面那句声明语句声明了两个变量。我们可以在一句声明语句中声明任意数目的变量,只要变量名之间用逗号(,)隔开就可以了。例如下面这个语句声明了 4 个变量。
          int a, b, c, d;

3. 乘法运算
    C 语言中,* 是乘法运算符,所以 centimeters = 100 * meters; 的意思是:用 100 乘以变量 meters 的值(本例中为 2),然后把相乘的结果赋值给变量 centimeters 。

4. printf 函数
        printf( "%d-meter is equal to %d centimeters.\n", meters, centimeters );
    上面这个语句中占位符 %d 出现了两次。第一个 %d 由变量 meters 的值替换;而第二个 %d 则由 centimeters 的值替换。注意:每个变量由逗号(,)隔开;"%d-meter is equal to %d centimeters.\n" 中的双引号是必须的,而且必须是英文的双引号,不能是中文的双引号。

printf( "Yes, I said %d centimeters!\n", 100 * meters );
    上面这个语句表明,用于替换占位符的不仅仅可以是变量,也可以是表达式(100 * meters 是一个乘法表达式)。










5. 如何编写函数
 

首先请看以下代码。

/* my_func.c -- 这个程序使用了一个自定义函数 */
         #include <stdio.h>

void butler(void);      /* ISO/ANSI C 函数原型 */

int main(void) /* 函数头 */
         { /* 函数体开始 */
               printf("I will summon the butler function.\n");
               butler();  /* 调用 butler 函数 */
               printf("Yes. Bring me some tea and writeable CD-ROMS.\n");

return 0;
         } /* 函数体结束 */

void butler(void)   /* butler 函数 */
         {
               printf("You rang, sir?\n");
         }

上面的代码中,butler 出现了 3 次。第一次是作为函数原型;第二次是函数调用语句;第三次是函数定义。下面我们分别对 butler 的这三次出现作详细说明。

1. 函数原型是声明函数的一种方式,是 C89 标准加入的概念,老旧的编译器可能不支持函数原型。函数原型用于告诉编译器我们将要使用一个特定的函数,它指明了函数的属性。例如,butler 的函数原型中,第一个 void 指明 butler 函数没有返回值;第二个 void 表明 butler 没有参数,也就是不接收任何参数。在 main 函数前面写了 butler 的函数原型后,当 main 函数调用 butler 时,编译器就能检测到 butler 函数调用语句是否正确。如果 main 函数前面没有 butler 的函数原型,那么我们就不能在 main 函数中调用 butler 函数,除非我们把函数定义放在 main 函数之前。不过把函数定义置于 main 函数之前是一种不好的编程风格,因为这将导致我们花不少时间来寻找 main 函数的所在地。想象一下,如果我们写了几十个函数,如果每个函数定义都置于 main 函数之前,那样 main 函数还算好找;但是如果我们不小心把某些函数放在了 main 函数后面,也就是说 main 函数被放在一堆函数中间,那就很难找了!
    C89 标准出台之前,C 语言也支持函数声明,不过我们只能指定函数的返回值类型,而不能列出参数列表。例如:
            void butler();
C89 之前,函数就是像上面所写的那样声明的。C89 和 C99 标准都支持这种声明方式,不过它们同时也指出,这种声明方式迟早会被淘汰!所以我们不要使用这种声明方式,而要用函数原型。

2. 在 main 函数里,语句 butler(); 的作用是调用 butler 函数。因为 butler 的参数列表为空(void),所以函数名(butler)后面的括号中不能有任何参数,也不能是 butler(void); 。

3. butler 函数和 main 函数的定义方式一样,也是由函数头函数体构成。函数头和函数原型几乎一模一样,只是少了一个分号。注意,函数定义仅仅是一个定义而已,并不能决定函数什么时候执行,也不能决定函数是否执行。main 函数什么时候调用 butler 函数,butler 函数就什么时候执行;如果 main 函数没有调用 butler 函数,那么 butler 函数就不会执行。

所有 C 程序都是从 main 函数开始执行的。无论 main 函数处在源文件中的任何位置,中间也罢,末尾也罢,总之,C 程序一定是从 main 函数开始执行。把 main 函数写在源文件的开头是一个好的编程习惯,因为这样可以让读者很快地弄清楚程序的结构。

到目前为止,我们已经对函数有了一个概要的了解。在后续的教程中,我们还会更详细更系统地学习函数。









6. 关键字和保留标识符

 

关键字是保留字,不能用来做标识符(如变量名),例如:int double; 是错误的,因为 double 是关键字,不能做变量名。使用关键字来做变量名是一种语法错误,不能通过编译!下表列出了 C 语言的所有关键字,其中红色的是 ISO C99 标准新增的关键字。

auto         enum        restrict      unsigned 
        break        extern      return          void 
        case         float       short           volatile
        char         for         signed          while 
        const        goto        sizeof          _Bool 
        continue     if          static          _Complex 
        default      inline     struct          _Imaginary 
        do           int         switch
        double       long        typedef
        else         register    union

C 语言已经使用了的标识符,以及使用权利被 C 语言保留的标识符,称为保留标识符。保留标识符包括以下划线(_)开始的标识符(如 __LINE__)和标准库里定义的函数的函数名(如 printf)。
    我们不应该使用保留标识符来做我们自定义的变量或者函数等的标识符。使用保留标识符来做自定义变量或者函数等的标识符不是语法错误,可以通过编译,因为保留标识符是合法的标识符,符合标识符命名法则。但是,因为这些标识符已经被 C 语言使用或者保留了,所以使用保留标识符来做自定义变量或者函数等的标识符可能会引起意想不到的问题。

(0)

相关推荐

  • C 语言基础教程(我的C之旅开始了)[二]

    3. C 程序的结构 C 程序由一个以上的函数组成,而且必须有 main 函数.此外,C 程序一般还有一些预处理指令.例如 #include 指令.当然并不是必须要有 #include 指令.函数由函数头和函数体组成.函数头由返回值.函数名以及参数列表(可以是void)组成.函数体从 { 开始,以 } 结束.函数体里可以有一系列的语句,每个语句以分号(;)结束.例如: 预处理指令     --〉   #include <stdio.h> 函数头         --〉  int main( v

  • C 语言基础教程(我的C之旅开始了)[八]

    19. 基本数据类型:复数类型和虚数类型 C99 新增了复数类型(_Complex)和虚数类型(_Imaginary).简单来说,C99 提供了三种复数类型:float _Complex,double _Complex,和 long double _Complex.对于 float _Complex 类型的变量来说,它包含两个 float 类型的值,一个用于表示复数的实部(real part),另一个用于表示虚部(imaginary part).类似地,double _Complex 包含两个

  • C 语言基础教程(我的C之旅开始了)[十]

    27. 表达式(Expression) 表达式由运算符和操作数组成.单独一个操作数是最简单的表达式.请看以下例子: 9                    -4                    +5                 3 + 6       a * ( b/c - d )             e = 9 / 3           f = ++e % 3 表达式中的表达式称为子表达式.例如:b/c 是 a * ( b/c - d ) 的子表达式. 每个表达式都有一个值,

  • C 语言基础教程(我的C之旅开始了)[六]

    14. 基本数据类型:字符型(上) 1.字符型(char)简介 字符型(char)用于储存字符(character),如英文字母或标点.严格来说,char 其实也是整数类型(integer type),因为 char 类型储存的实际上是整数,而不是字符.计算机使用特定的整数编码来表示特定的字符.美国普遍使用的编码是 ASCII(American    Standard    Code   for    Information   Interchange  美国信息交换标准编码).例如:ASCII

  • C 语言基础教程(我的C之旅开始了)[五]

    12. 基本数据类型:整型(下) 1. 输出各种整数类型的变量 输出不同类型的整数,需要使用不用的格式限定符.输出 unsigned int 类型的整数,要用 %u .输出 long ,要用 %ld:如果要以十六进制或者八进制形式输出,那就用 %lx(或者%lX)或者 %lo.注意:虽然整数常量的后缀使用大写或者小写英文字母都没关系,但是它们格式限定符必须使用小写!如果我们要输出 short 类型的整数,可以在 %d 中间加上前缀 h,也就是%hd:同理,%ho 和 %hx(或者 %hX )分别

  • C 语言基础教程(我的C之旅开始了)[四]

    10. 基本数据类型:整型(上) 1. 整型 int C 语言提供了很多整数类型(整型),这些整型的区别在于它们的取值范围的大小,以及是否可以为负.int 是整型之一,一般被称为整型.    int 代表有符号整数,也就是说,用 int 声明的变量可以是正数,可以是负数,也可以是零,但是只能是整数.标准规定 int 的最小取值范围是 -32767 到 32767.int 的取值范围因机器而异,但是一定要大于或者等于-32767到 32767.一般来说,int 占用一个字的内存空间.因此,字长为

  • C 语言基础教程(我的C之旅开始了)[三]

    7. 第三个 C 程序 首先请看下面这个小程序,试着自己编译运行一下.如果不懂怎么编译,请点击下面的超链接:      编译器使用方法    编译器Dev-C++下载&使用教程 /* circle.c  --  计算圆的面积 */ #include <stdio.h> int main( void )      {          float radius;    /* 圆的半径 */ printf( "Please enter the radius: " ); 

  • C 语言基础教程(我的C之旅开始了)[九]

    24. +.-.*./.= 的优先级 1. 优先级 和数学一样,C 语言规定先乘除后加减.也就是说,乘法运算符和除法运算符的优先级(Precedence)比加法运算符和减法运算符高.同时,C 语言也规定,如果两个运算符的优先级相同,并且它们之间没有被优先级比它们高或者低的运算符隔开,则它们的运算顺序根据它们在语句中出现的先后而定.大多数运算符都是从左向右进行运算的,不过也有从右向左进行运算的(例如赋值运算符).乘法运算符和除法运算符的优先级相同,加法运算符和减法运算符的优先级相同.因此,以下语句

  • C 语言基础教程(我的C之旅开始了)[七]

    17. 基本数据类型:布尔型(_Bool type) _Bool 型是 C99 添加的,用于表示布尔值,亦即是表示逻辑真(true)和逻辑假(false).因为 C 用 1 表示 true ,0 表示 false ,所以 _Bool 实际上是整数类型.理论上 _Bool 只需要 1 bit 存储单元,因为1 bit 就足以表示 0 和 1 .事实上,_Bool 是无符号整型,一般占用 1 字节.例如: _Bool flag = 1; flag = 0; 包含标准头文件 stdbool.h 后,我

  • C 语言基础教程(一)颜色加亮

    首先请看下面这个简单的 C 程序,猜猜它会做些什么.猜不出来也没关系,后面会有详细的解说.         #include <stdio.h> int main( void )            /* 一个简单的程序 */         {             int num;                  /* 定义一个名叫 num 的变量 */             num = 1;                  /* 将 1 赋值给 num         */ p

随机推荐