一个简单的 C 程的序的一般形式

目录汇总:C 语言入门教程:面向萌新小白的零基础入门教程

在上一篇文章中,我们 编写了一个简单的 C 程序,下面一起来仔细研究一下 pun.c 程序,并且由此归纳出一些通用的程序格式。简单的 C 程序一般具有如下形式:

指令

int main(void)
{
  语句
}

注意如何使用大括号来标出 main 函数的起始和结束。C 语言使用 {} 的方式非常类似于其他语言中 beginend 的用法。这也说明了有关 C 语言一个共识:C 语言极其依赖缩写词和特殊符号,这是 C 程序非常简洁(或者不客气地说含义模糊)的一个原因。

即使是最简单的 C 程序也依赖 3 个关键的语言特性:指令(在编译前修改程序的编辑命令)、函数(被命名的可执行代码块,如 main 函数)和语句(程序运行时执行的命令)。下面将详细讨论这些特性。

一、指令#

在编译 C 程序之前,预处理器会首先对其进行编辑。我们把预处理器执行的命令称为指令。

程序 pun.c 由下列这行指令开始:

1
#include <stdio.h>

这条指令说明,在编译前把 <stdio.h> 中的信息“包含”到程序中。<stdio.h> 包含了关于 C 标准输入/输出库的信息。C 语言拥有大量类似于 <stdio.h> 的头(header),每个头都包含一些标准库的内容。这段程序中包含 <stdio.h> 的原因是:C 语言不同于其他的编程语言,它没有内置的“读”和“写”命令。输入/输出功能由标准库中的函数实现。

所有指令都是以字符 # 开始的。这个字符可以把 C 程序中的指令和其他代码区分开来。指令默认只占一行,每条指令的结尾没有分号或其他特殊标记。

二、函数#

函数类似于其他编程语言中的“过程”或“子例程”,它们是用来构建程序的构建块。事实上,C 程序就是函数的集合。函数分为两大类:一类是程序员编写的函数,另一类则是作为 C 语言实现的一部分提供的函数。我们把后者称为库函数(library function),因为它们属于一个由编译器提供的函数“库”。

术语“函数”来源于数学。在数学中,函数是指根据一个或多个给定参数进行数值计算的规则:

函数

C 语言对“函数”这个术语的使用则更加宽松。在 C 语言中,函数仅仅是一系列组合在一起并且赋予了名字的语句。某些函数计算数值,某些函数不这么做。计算数值的函数用 return 语句来指定所“返回”的值。例如,对参数进行加 1 操作的函数可以执行语句

1
return x + 1 ;

而当函数要计算参数的平方差时,则可以执行语句

1
return y * y - z * z;

虽然一个 C 程序可以包含多个函数,但只有 main 函数是必须有的。main 函数是非常特殊的:在执行程序时系统会自动调用 main 函数。

main 函数的名字是至关重要的,绝对不能改写成 begin 或者 start,甚至写成 MAIN 也不行。

如果 main 是一个函数,那么它会返回一个值吗?是的。它会在程序终止时向操作系统返回一个状态码。我们再来看看 pun.c 程序:

1
2
3
4
5
6
7
#include <stdio.h>

int main(void)
{
  printf("To C, or not to C: that is the question.\n");
  return 0;
}

main 前面的 int 表明该函数将返回一个整数值。圆括号中的 void 表明 main 函数没有参数。语句

1
return 0;

有两个作用:一是使 main 函数终止(从而结束程序),二是指出 main 函数的返回值是 0。在后面我们还将详细论述 main 函数的返回值。但是现在我们始终让 main 函数的返回值为 0,这个值表明程序正常终止。

如果 main 函数的末尾没有 return 语句,程序仍然能终止。但是,许多编译器会产生一条警告信息(因为函数应该返回一个整数却没有这么做)。

三、语句#

语句是程序运行时执行的命令。本教程后面的几个部分将进一步探讨语句。程序 pun.c 只用到两种语句。一种是返回(return)语句,另一种则是函数调用(function call)语句。要求某个函数执行分派给它的任务称为调用这个函数。例如,程序 pun.c 为了在屏幕上显示一条字符串就调用了 printf 函数:

1
printf("To C, or not to C: that is the question.\n");

C 语言规定每条语句都要以分号结尾。(就像任何好的规则一样,这条规则也有一个例外:后面会遇到的复合语句就不以分号结尾。)由于语句可以连续占用多行,有时很难确定它的结束位置,因此用分号来向编译器显示语句的结束位置。但指令通常都只占一行,因此不需要用分号结尾。

四、显示字符串#

printf 是一个功能强大的函数。到目前为止,我们只是用 printf 函数显示了一条字符串字面量(string literal)——用一对双引号包围的一系列字符。当用 printf 函数显示字符串字面量时,最外层的双引号不会出现。

当显示结束时,printf 函数不会自动跳转到下一输出行。为了让 printf 跳转到下一行,必须在要显示的字符串中包含 \n(换行符)。写换行符就意味着终止当前行,然后把后续的输出转到下一行。为了说明这一点,请思考把语句

1
printf("To C, or not to C: that is the question.\n");

替换成下面两个对 printf 函数的调用后所产生的效果:

1
2
printf("To C, or not to C: ");
printf("that is the question.\n");

第一条 printf 函数的调用语句显示出 To C, or not to C:,而第二条调用语句则显示出 that is the question. 并且跳转到下一行。最终的效果和前一个版本的 printf 语句完全一样,用户不会发现什么差异。

换行符可以在一个字符串字面量中出现多次。为了显示下列信息:

Brevity is the soul of wit.
  --Shakespeare

可以这样写:

1
printf("Brevity is the soul of wit.\n  --Shakespeare\n");

(完)

comments powered by Disqus