printf("My "); /* forgot to close this comment... printf("car "); printf("has "); /* so it ends here */ printf("fleas");
因为在第一条注释中遗漏了结束标志,所以编译器忽略了中间的两条语句,因此程序最终只打印了My fleas。
C99提供了另一种类型的注释,以//(两个相邻的斜杠)开始:// This is a comment
这种风格的注释会在行末自动终止。如果要创建多于一行的注释,既可以使用以前的注释风格(/* ... */),也可以在每一行的前面加上//:
// Name: pun.c // Purpose: Prints a bad pun. // Author: K. N. King
新的注释风格有两个主要优点:首先,因为注释会在行末自动终止,所以不会出现未终止的注释意外吞噬部分程序的情况;其次,因为每行注释前面都必须有//,所以多行注释看上去更加醒目。
2.4 变量和赋值
很少有程序会像2.1节中的示例那样简单。大多数程序在产生输出之前往往需要执行一系列的计算,因此需要在程序执行过程中有一种临时存储数据的方法。和大多数编程语言一样,C语言中的这类存储单元被称为变量(variable)。
2.4.1 类型
每一个变量都必须有一个类型(type)。类型用来说明变量所存储的数据的种类。C语言拥有广泛多样的类型。但是现在,我们将只限定在两种类型范围内:int类型和float类型。因为类型会影响变量的存储方式以及允许对变量进行的操作,所以选择合适的类型是非常关键的。数值型变量的类型决定了变量所能存储的最大值和最小值,同时也决定了是否允许在小数点后出现数字。
int(integer的简写)型变量可以存储整数,如0、1、392或-2553。但是,整数的取值范围(➤7.1节)是受限制的。最大的整数通常是2 147 483 647,但在某些计算机上也可能是32 767。
float(即floating-point的简写)型变量可以存储比int型变量大得多的数值。而且,float型变量可以存储带小数位的数,如379.125。但float型变量也有一些缺陷。进行算术运算时float型变量通常比int型变量慢;更重要的是,float型变量所存储的数值往往只是实际数值的一个近似值。如果在一个float型变量中存储0.1,以后可能会发现变量的值为0.099 999 999 999 999 87,这是舍入造成的误差。2.4.2 声明
在使用变量之前必须对其进行声明(为编译器所做的描述)。为了声明变量,首先要指定变量的类型,然后说明变量的名字。(程序员决定变量的名字,命名规则见2.7节。)例如,我们可能这样声明变量height和profit:
int height; float profit;
第一条声明说明height是一个int型变量,这也就意味着变量height可以存储一个整数值。第二条声明则表示profit是一个float型变量。
如果几个变量具有相同的类型,就可以把它们的声明合并:
int height, length, width, volume; float profit, loss;
注意每一条完整的声明都要以分号结尾。
在main函数的第一个模板中并没有包含声明。当main函数包含声明时,必须把声明放置在语句之前:
int main(void) { 声明 语句 }
第9章中我们会看到,函数和程序块(包含嵌入声明的语句,➤10.3节)一般都有这样的要求。就书写格式而言,建议在声明和语句之间留出一个空行。
在C99中,声明可以不在语句之前。例如,main函数中可以先有一个声明,后面跟一条语句,然后再跟一个声明。为了与以前的编译器兼容,本书中的程序不会采用这一规则。2.4.3 赋值
变量通过赋值(assignment)的方式获得值。例如,语句
height = 8; length = 12; width = 10;
把数值8、12和10分别赋给变量height、length和width,8、12和10称为常量(constant)。
变量在赋值或以其他方式使用之前必须先声明。也就是说,我们可以这样写:
int height; height = 8;
但下面这样是不行的:
height = 8; /*** WRONG ***/ int height;
赋给float型变量的常量通常带小数点。例如,如果profit是一个float型的变量,可能会这样对其赋值:
profit = 2150.48;