首先从一个最简单的C语言程序开始,建立C语言程序的基本概念。这个程序的任务是编写一个C语言程序能输出如下一行文字:
hello,world
“hello,world”程序最早出现于Kernighan 1972年编写的内部技术文档 Introduction to the Language B 之中,后来该程序出现在Kernighan和Ritchie的经典名著 The C Programming Language 一书中。因C语言的广泛使用而逐渐成为各种程序设计语言中最基本、最简单的程序,通常是初学者所编写的第一个程序。
试试看:输出"hello,world"。
C程序从编写到运行要经过四个基本过程:编辑、编译、链接、运行。下面就从如何实现“hello,world”的输出来分析这四个基本过程。
源程序是一系列的语句或指令,用于指示计算机执行指定的任务。大多数编译器都自带编辑器,可用来输入源程序,并且提供很多便于编写和组织程序的功能。通常会对程序文本的格式进行自动排版,如高亮显示特殊的语法及代码自动缩进等功能,这样不仅便于阅读,也帮助减少代码的错误率。
常用的C语言编译器有Visual C++6.0集成开发环境、Dev-C++集成开发环境和Code::Blocks,它们各有优缺点。大多数C语言课程都采用Visual C++6.0编译器,但Visual C++6.0一直不支持C99标准。本书没有把C99标准贯穿其中,而在附录E中介绍了C99标准。
/*程序1-1:在屏幕上输出"hello,world"*/
打开编辑器,输入以上程序,然后保存该文件。注意不要遗漏圆括号()、花括号{}、双引号""、分号等。1.4节会对程序的要素进行详细的说明,这里仅做简要介绍,程序第一行
#include<stdio.h>
是必不可少的,它包含了C语言标准输入/输出库函数的相关信息。
每个C程序都由一个或多个函数构成,其中必须有一个main()——因为每个程序总是从这个函数开始执行。一对花括号内的代码块,称为函数体,它包含了定义函数功能的所有语句。这个例子中的main()函数体非常简单:
printf("hello,world\n");
printf()函数用来显示期望信息"hello,world",然而字符\n并没有打印在屏幕上,\n表示显示信息后要进行换行操作。
return 0;
表明程序终止时会向操作系统返回0。
我们编写了程序1-1,并生成了一个名为hello.c的文件(C程序的文件扩展名为.c)。接下来,就需要把程序转化为机器可以执行的形式。通常情况下,系统需要做以下3项工作:
1.预处理及编译
C语言源代码接近人类语言,便于人们理解和表达,但计算机无法理解C语言源代码,计算机只能理解被翻译成机器语言的二进制指令,因此必须将源代码转换为机器语言,C程序才能被计算机执行。这个转换工作是由名为编译器的程序完成的。编译器会把源代码转换成机器语言指令(目标代码)。编译器可以在转换的过程中发现并报告错误。编译阶段出现错误,意味着必须重新编辑源代码。反之,如果编译成功,就会产生一个目标文件,该文件与源文件同名,但扩展名是.o或.obj。但是,这时的程序还不能运行。
在任何一个C语言系统中,总有一个预处理程序,在编译工作开始之前自动执行,预处理器处理以#开头的命令,如程序1-1中的#include <stdio.h>,将文件stdio.h包含进来一起编译。
2.链接
一个C语言源程序通常会调用在其他地方定义的函数,如标准函数库或同一个项目组的其他成员编写的函数库中定义的函数。链接器把由编译器产生的目标文件和函数库中已经编译过的目标代码组合起来,生成最终的可执行文件,如图1-3所示。链接器也可以检查和报告错误,例如遗漏了程序的某个部分,或者引用了一个根本不存在的库函数等。链接阶段出现错误,也意味着必须重新编辑源代码。如果链接成功,就会产生一个可执行文件(扩展名为.exe)。
图1-3 链接器的作用
3.加载和运行
通过链接得到的可执行文件在执行之前,必须被加载到内存中。最后,在CPU的控制下,逐条执行程序中的机器指令。在大多数IDE中,都有一个相应的命令菜单,来运行编译、链接得到的可执行程序。可以采用在命令窗口输入文件名,或Windows中双击文件名的方式来运行可执行程序。这一阶段,计算机会精准地执行指令,运行结果可能是正确的,也可能是错误的,甚至可能造成计算机系统的崩溃。
编译、链接和运行过程中都可能发现错误,这意味着要返回编辑阶段,检查并修改源代码。编写程序是一件复杂的工作,难免出现错误,所以需要逐步处理错误,直到获得期望的结果为止。图1-4总结了创建执行C程序的各个过程。
图1-4 创建和执行程序的过程