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) centimeters = 100 * meters; /* 100 乘以 meters */ return 0; 下面我们来仔细分析这个小程序。 1. 文档 2. 多重声明 3. 乘法运算 4. printf 函数 printf( "Yes, I said %d centimeters!\n", 100 * meters ); |
5. 如何编写函数 |
首先请看以下代码。 /* my_func.c -- 这个程序使用了一个自定义函数 */ void butler(void); /* ISO/ANSI C 函数原型 */ int main(void) /* 函数头 */ return 0; void butler(void) /* butler 函数 */ 上面的代码中,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 函数被放在一堆函数中间,那就很难找了! 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 C 语言已经使用了的标识符,以及使用权利被 C 语言保留的标识符,称为保留标识符。保留标识符包括以下划线(_)开始的标识符(如 __LINE__)和标准库里定义的函数的函数名(如 printf)。 |