分析程序
我们学习了怎么样创建一个C源码文件(后缀是.c的文件,例如test.c),然后,编译程序,得到可执行的程序,最终执行程序。
现在,我们来分析C源码文件中的C程序,就是所谓的“代码”。这个C程序的代码如下:
#include <stdio.h> //包含头文件, 为了使用printf()函数;
#include <stdlib.h> //包含头文件, 为了使用system()函数;
int main() //定义程序的主函数, 就是程序的入口地址;
{ //主函数的开始标记;
printf("Now time =\n"); //输出提示;
system("date"); //输出系统时间;
return 0; //返回结束状态;
} //主函数的结束标记;
现在我们来分析一个C程序主要有3部分组成:
(1)包含头文件,引用系统提供的接口函数;
(2)程序的主函数,即程序的入口地址,程序从哪个地方开始执行;
(3)程序语句,实现程序功能的具体指令;如果把程序比作一栋大楼,那么,程序语句就是组成大楼的钢筋水泥;
3.1包含头文件
举个例子,如果大家要起一栋大楼,会用到铁铲、推车之类的工具。这些工具会存放在某个指定的地方,一般称为“仓库”。同样,程序中使用到了printf()这样的函数,这些函数如同铁铲之类的工具,存放在C语言的“仓库”中。那么,在C语言中,这些仓库我们可以称为“头文件”。
C语言中定义的头文件,就是以.h为结尾的文件。例如 stdio.h、stdlib.h文件,就是系统提供的头文件。如同C语言提供的“仓库”,里面存放了许多有用的铁铲、推车等工具,使用这些工具,我们就可以开发出一个程序。
要在代码中引用指定的头文件,格式如下:
#include <xxx.h>
其中xxx的头文件的名称。这个格式是固定的,前面必须是 #include 关键字,然后使用尖括号“< >”,中间是引用的 .h 头文件。
所以,我们知道了头文件的作用,就是一个仓库,存放很多编码使用的工具。我们必须使用仓库中的工具,才可以进行编码。随着学习的深入,我们可以定义自己的仓库,存放自己定义的函数模块。就是定义自己的.h头文件,然后,声明引出自己定义的函数,让其他模块使用。
3.2程序的入口
读书的时候,每一个学校都有一个校门口,要合法、正规地进入学校,就只能够通过校门口进入。当然也可以通过翻墙等行为进出学校,但是都不是学校所允许的。同样的道理,每一个程序要能够操作系统上正常运行,都必须提供一个入口,让操作系统通过这个入口,加载程序中的数据,然后,运行程序。
C语言中定义了程序入口,就是main函数。在我们的测试例子中,有:
int main() //定义程序的主函数, 就是程序的入口地址;
{ //主函数的开始标记;
printf("Now time =\n"); //输出提示;
system("date"); //输出系统时间;
return 0; //返回结束状态;
} //主函数的结束标记;
这就是定义了main函数,这个main函数的定义是:
(1)函数的返回值类型是 int类型,就是返回一个int类型的数据;
(2)函数名的名称必须是main关键词;
(3)函数名main后面接一个小括号(),括号里是空,表示不携带参数;
(4)在小括号()后面接一个大括号{ },这个大括号{ }中的代码就是main函数要执行的代码;
(5)执行代码的最后,通过 return 关键字返回0数值,就是为了符合main函数开始定义时,要求返回int类型的变量。
在这里,我们讲解了main函数的定义,主要是说明main函数是程序的入口地址,如同一个学校的校门口一样,要通过校门口,才可以进入学校。同样,main函数提供了程序的入口地址,所以,我们要写的程序代码,就是在main函数中编写,main函数被操作系统调用之后,我们写的程序代码也就被操作系统调用执行。
所以,在main函数中,我们就编写了需要执行的代码。 操作系统把程序加载到内存之后,找到main函数这个入口,然后,就一条一条地执行我们编写的代码。
3.3函数体的代码
程序的入口是从main函数开始,所以,我们要实现的代码也就是在main函数的函数体中编写。main函数的定义格式是:
int main() //定义程序的主函数, 就是程序的入口地址;
{
} //主函数的结束标记;
那么,函数体就是在大括号{ }中的代码。在测试例子中,函数体中的代码是:
printf("Now time =\n"); //输出提示;
system("date"); //输出系统时间;
return 0; //返回结束状态;
这些代码的作用是:
(1) printf函数输出 "Now time=\n" 字符串中的数据,后面的"\n"表示回车换行;
(2) system函数执行参数"date"指定的动作,获取系统时间输出;
(3) return关键字返回一个值,表示退出main函数的运行;
注意:每一行代码必须以引号“;”结束。除了遇到如下几种特殊情况:
(1)使用#include包含头文件,不需要引号结束;
(2)函数的声明,在小括号()后面,不需要引号结束;
(3)函数体的大括号{}后面,不需要引号结束;
那么,当我们学习了变量,运算符,表达式,输入/输出函数等知识之后,就可以自由编写函数体中的代码,实现更加复杂的功能。我们可以把想要计算机实现的功能通过C语言来描述,然后,编译成可执行程序来运行。
3.4程序的注释
我们先来看看一个测试例子:
#include <stdio.h> //包含头文件, 为了使用printf()函数;
int main() //定义程序的主函数, 就是程序的入口地址;
{ //主函数的开始标记;
/*注释
可以注释多行
代码*/
printf("test abc!\n");
return 0; //返回结束状态;
}
测试运行结果如下:
mylinux@ubuntu:~/src/test$ gcc test.c -o exe
mylinux@ubuntu:~/src/test$ ./exe
test abc!
在这个测试例子中,我们主要讲解C语言的“注释”。在代码中添加注释很有必要,例如,我们需要描述某一段关键的代码,描述某一个函数模块的时候,就需要在代码中添加注释,那么,当一个项目有多个开发人员在共同开发时,大家可以通过代码的注释来快速了解代码的构造和设计。
C语言提供了两种中注释方法:
(1)单行注释
在一行中,以两个反斜杠“//”开始,后面接着的数据就是注释。注释的数据不会被编译器编译,所以,注释里面写的东西可以中文或其他字符,不要求是C语言写的代码。注意:“//”注释符只能够在单一行中使用,不能够跨越多行。例如上面的例子中,有:
int main() //定义程序的主函数, 就是程序的入口地址;
这是合法的,因为注释符“//”后面接的数据都是在一行中。
(2)多行注释
“多行注释”也称为“块注释”,就是可以注释多行代码块。多行注释是以“/*”开始,以“*/”结束。例如上面例子中的代码有:
/*注释
可以注释多行
代码*/
printf("test abc!\n");
就是通过/* */来注释多行。注意,多行注释符 /* */ 不能够嵌套,不能够编写 /* abc /*123*/www*/ 这样的嵌套注释,嵌套注释是不允许的。
多行注释的规则是:从第一个/*符号开始,遇到第一个 */ 符号结束。所以,对于 /* abc /*123*/www*/ 这样的嵌套注释,只是注释了 /* abc /*123*/ 数据,剩下的 www*/没有配对,所以,是不合法的。