2.2 实例说明

我们来将程序的源代码分析两遍。第一遍(快速简介)着重解释每一行的含义,帮助你对整个过程有一个大概的了解。第二遍(程序细节)分析具体的内涵和细节,帮助你更深入地了解程序。

图2.1总结了一个C程序的各个部分,其中包含的基本概念比第一个例子中的多。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

阅读 ‧ 电子书库

图2.1 C程序剖析
2.2.1 第一遍 快速简介

本小节依次在程序的每一行后面都给出一个简单的描述。下一小节则更全面地探讨这里所引起的话题。

阅读 ‧ 电子书库

该行告诉编译器包含文件stdio.h中的全部信息。文件stdio.h是所有C语言编译包的一个标准部分。这个文件对关键字输入和显示输出提供支持。

阅读 ‧ 电子书库

C程序中包含一个或多个函数,它们是C程序的基本模块。上面这个程序包含一个名为函数。圆括号表明main()是一个函数的名字。int表示main()函数返回一个整数,而void表示main()函数不接受任何参数。这些是我们稍后将要深入讨论的。现在,只须把int和void看作是用来定义main()函数的标准ISO/ANSI C方法的一部分(如果您使用ISO/ANSI之前的C编译器,请省略void;为避免不兼容,您应该使用较新的C编译器)。

阅读 ‧ 电子书库

符号/*和*/中包含有助于使程序更清晰的注释性内容。它们只是为了帮助读者理解,在编译时将被编译器忽略。

阅读 ‧ 电子书库

这个开始花括号标志着组成函数的语句的开始。而结束花括号(})则标志函数的结束。

阅读 ‧ 电子书库

这个语句表明您将使用num这个变量,并且它是int(整数)类型的。

阅读 ‧ 电子书库

该语句表明把值1赋给num这个变量。

阅读 ‧ 电子书库

第一个printf()语句在屏幕上显示"I am a simple",并且让光标留在同一行。这里的printf()是C标准库的一部分。用术语来讲,它是一个函数。在一个程序里使用一个函数,术语称做调用一个函数。

阅读 ‧ 电子书库

接下来的这个printf()函数调用语句表示在上条语句所显示的内容后面添加"computer"。符号\n告诉计算机要另起一行,也就是说把光标移到下一行的开始。

阅读 ‧ 电子书库

最后使用printf()把num的值(其值为1)内嵌在用引号引起来的词组中进行输出。%d指示输出num值的位置和形式。

阅读 ‧ 电子书库

C函数可以给它的使用者提供或返回一个数值。现在可以暂时认为这一行用来满足ISO/ANSI C对正确书写main()函数所做的要求。

阅读 ‧ 电子书库

显然,程序必须以一个结束花括号终止。

2.2.2 第二遍 程序细节

既然已经浏览了一遍程序清单2.1,我们就来仔细分析这个程序。我们再一次来考察程序中的单行语句。这次,我们以每一行代码为出发点,深入探讨隐藏在代码背后的细节,以便为更全面地了解C语言编程特性打下基础。

一、#include指示和头文件

阅读 ‧ 电子书库

这是程序的第一行。该语句的作用相当于您在文件中该行所在的位置键入了文件stdio.h的完整内容。实际上,它是一种剪切和粘贴操作,这样可以方便地在多个程序间共享公用的信息。

#include语句是C预处理器指令(preprocessor directive)的一个例子。通常,C编译器在编译前要对源代码做一些准备工作;这称为预处理(preprocessing)。

stdio.h文件作为所有C编译包的一部分提供,它包含了有关输入和输出函数(例如printf())的信息以供编译器使用。这个名字代表标准输入输出头文件(standard input/output header)。在C世界中,人们称出现在文件顶部的信息集合为头(header),C实现通常都带有许多头文件。

最重要的是头文件包括了建立最终的可执行程序时编译器需要用到的信息。例如,它们可以定义常量,或者说明函数名以及该函数如何使用。但是函数的实际代码被包含在一个预编译代码的库文件中,而不是在头文件中。编译器的链接部分负责找到您所需要的库代码。简言之,头文件指引编译器把您的程序正确地组合在一起。

ISO/ANSI C已经对必须提供哪些头文件制定了标准。有些程序需要包含stdio.h而有些则不需要。一个具体C实现的文档应该包括对C函数库中函数的描述。这些描述指出了函数所需的头文件。例如,对printf()的描述指明需要使用stdio.h。不包括合适的头文件也许不会影响一个具体的程序,但是最好不要这么做。本书每次用到库函数时,都使用ISO/ANSI标准为这些函数指定的包含文件。