下面是另一个简单程序的例子,从中可以了解各行代码的作用,并由此了解一些通用的程序格式。
/*程序1-2:计算两个整数的和*/
1.注释
程序1-2中的第一行
/*此程序输出两个整数的和*/
以“/*”开始,以“*/”结束,这部分内容是注释。在程序中添加注释是一个非常好的编程习惯,注释可以放在程序的任意位置,用来说明代码的作用、解释代码的工作原理。编译器在编译程序时会忽略所有的注释,不会为注释生成任何可执行代码。增加注释是为了增强程序的可读性以及更好地进行团队合作。
注释可以单独占一行,例如:
一个注释可以分散在多行上,无论“/*”和“*/”出现在程序的什么地方,/*和*/之间的所有内容都是注释。下面这个注释是用来说明代码的作者及创建日期等信息。
C99标准中支持C++语言中的单行注释“//”,从“//”到行尾的任何字符都是注释。这种注释方法既可以用于整行注释,也可以用于在一行代码的右侧加注释。
int a,b,sum; //定义整型变量a、b、sum
Visual C++支持单行注释“//”。因为Visual C++虽不支持C99,但它支持C++。而C99标准中的注释//,就是借鉴了C++的注释风格。
2.预处理
程序1-2由下列代码行开始:
#include<stdio.h>
在编译C程序之前,预处理器会首先对其进行处理。本书将在第11章详细讨论预处理器指令,在这里只关注#include指令。这条指令说明,在编译前将<stdio.h>中的信息“包含”到程序中。<stdio.h>是标准输入/输出头文件,包含了编译器理解printf()以及其他输入输出函数所需要的信息。
以.h为扩展名的文件称为头文件,头文件可以是编译器自带的头文件,主要包含与C标准库函数相关的声明,也可以是自己创建的头文件。C语言的一个突出优点就是它具有标准库,包含了数百个用于输入/输出、字符串处理等实用操作的函数,参见附录D。
3.main()函数
一个C程序可以包含一个或多个函数,几乎所有的功能都由函数实现,除了直接调用标准库函数,还可以为实现某个功能编写自定义函数,C语言可以称作函数语言。每个程序都必须有一个main()函数,因为在执行程序时,系统会自动调用main()函数,从main()函数开始执行。在第5章,将学习如何编写自定义函数,在此之前我们涉及的所有程序都只包含一个main()函数。
在程序1-2中看到函数的定义int main(void),表示程序结束时会返回一个整数值。return0表示main()函数的返回值为0,这个值表示程序正常结束。
(1)main()函数的名字绝对不能修改,也不能写成MAIN;
(2)每一个函数的函数体定义在一对花括号内,并且内容要有统一的缩进量,这个缩进能更加突出程序中函数的结构,增加程序的可读性。
4.语句
C程序的执行部分是由语句组成的。程序的功能也是由执行语句实现的。程序1-2中用到了三种语句,一种是赋值语句,如“sum=a+b;”;一种是返回语句,如“return 0;”;还有一种是函数调用语句,如printf("%d\n",sum)。要求某个函数执行分派给它的任务称为调用这个函数。
C语言规定函数主体中的每个语句都以分号结束(这条规则也有例外:从第3章开始会遇到复合语句,复合语句就不以分号结尾)。C程序中的一个语句可以跨越多行,用分号通知编译器该语句已结束。另外,预处理指令通常只占一行,不需要用分号结束。
(1)在每个逗号后面加一个空格,可以增加程序的可读性;
(2)在二元运算符(如“+”)的前后各加一个空格,能突出二元运算符,并增加程序的可读性。
5.输入/输出
为了从键盘获取输入的数值,要用到scanf()函数;为了把计算结果输出到显示器中,要用到printf()函数。这两个函数都是标准库函数,都需要使用格式串来指定输入或输出数据的形式。第2章中将详细介绍这两个函数。
在程序1-2中,对于变量a和b,用赋值语句来赋值a=3和b=5,若要计算任意两个整数的和该如何处理?可以通过调用scanf()函数来实现:
scanf("%d",&a);
scanf("%d",&b);
也可以写成一条语句:
scanf("%d%d",&a,&b);
若要将程序的处理结果在屏幕上输出,可以调用printf()函数来实现:
printf("%d\n",sum);
6.标识符
标识符是由字母、数字和下划线组成的字符序列,其中第一个字符必须是字母或下划线。例如,sum是一个合法的标识符,而sum&number是非法的。在C语言中,标识符中的英文字母是区分大小写的,例如,sum和SUM是两个不同的标识符。标识符分为三类:
(1)关键字:C语言有32个关键字。关键字具有特殊意义,它们主要与数据类型和语句有关,如int用于定义整数类型,return用于函数的返回。程序中不能将关键字用于其他目的,具体的关键字信息请看附录B。
(2)预定义标识符:预定义标识符包括编译预处理命令,如include、define等;系统标准库函数名,如scanf()、printf()、strcpy()、strcmp()、sqrt()等。
(3)用户自定义标识符:用于对用户使用的变量、数组、函数等操作对象进行命名。用户自定义标识符不能与C编译系统已经预定义的、具有特殊用途的关键字同名,如不能将自定义标识符命名为int,也尽量不要与预定义标识符重名,否则会改变其原有含义。