1 常量和符号常量
在程序运行过程中,其值不能被改变的量称为常量。常量区分为不同的类型,如12、0、-3为整型常量,4.6、-1.23为实型常量,'a'、'd'为字符常量。常量一般从其字面形式即可判别。这种常量称为字面常量或直接常量。
也可以用一个标识符代表一个常量,如:
例3.1 符号常量的使用。
# define PRICE 30
Main
{
int num, total;
num=10;
total=num*PRICE:
printf("total=%d\n",total);
}
程序中用 # define 命令行定义PRICE代表常量30,此后凡在本文件中出现的 PRICE 都代表 30,可以和常量一样进行运算,程序运行结果为
total=300
这种用一个标识符代表一个常量的,称为符号常量,即标识符形式的常量。请注意符号常量不同于变量,它的值在其作用域(在本例中为主函数)内不能改变,也不能再被赋值。如再用以下赋值语句给PRICE赋值是错误的。
PRICE=40;
习惯上,符号常量名用大写,变量名用小写,以示区别。使用符号常量的好处是:
(1)含义清楚。如上面的程序中,看程序时从PRICE就可知道它代表价格。因此定义符号常量名时应考虑“见名知意”。在一个规范的程序中不提倡使用很多的常数,如: sum= 15 * 30 *23.5*43。在检查程序时搞不清各个常数究竟代表什么。应尽量使用“见名知意”的变量名和符号常量。
(2)在需要改变一个常量时能做到“一改全改”。例如在程序中多处用到某物品的价格,如果价格用常数表示,则在价格调整时,就需要在程序中作多处修改,若用符号常量 PRICE 代表价格,只需改动一处即可。如:
# define PRICE 35
在程序中所有以PRICE代表的价格就会一律自动改为35。
2变量
其值可以改变的量称为变量。一个变量应该有一个名字,在内存中占据一定的存储单元。在该存储单元中存放变量的值。请注意区分变量名和变量值这两个不同的概念,见图3.1。变量
名实际上是一个符号地址,在对程序编译连接时由系统给每一个变量名分配一个内存地址。在程序中从变量中取值,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据。
和其他高级语言一样,用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列称为标识符(identifier)。简单地说,标识符就是一个名字。
C语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。下面列出的是合法的标识符,也是合法的变量名:
sum,average,-total.Class.day,month.Student -name,tan,lomus -1-2-3,BASIC,li_ling
下面是不合法的标识符和变量名:
M.D.John,¥123,#33,3D64,a>b
注意,大写字母和小写字母被认为是两个不同的字符。因此,sum 和SUM,Class 和 class 是两个不同的变量名。一般,变量名用小写字母表示,与人们日常习惯一致,以增加可读性。
ANSIC标准没有规定标识符的长度(字符个数),但各个C编译系统都有自己的规定。有的系统(如IBM PC的MSC)取8个字符,假如程序中出现的变量名长度大于8个字符,则只有前面8个字符有效,后面的不被识别。例如,有两个变量:student_name和 student_number,由于二者的前8个字符相同,系统认为这两个变量是一回事而不加区别。可以将它们改为stud.name 和stud_num,以使之区别。TurboC则允许32个字符。因此,在写程序时应了解所用系统对标识符长度的规定,以免出现上面的混淆。这种错误并不反映在编译过程中(即语法无错误),但运行结果显然不对。为了程序的可移植性(即在甲机器上运行的程序可以基本上不加修改,就能移到乙机器上运行)以及阅读程序的方便,建议变量名的长度不要超过8个字符。
如前所述,在选择变量名和其他标识符时,应注意做到“见名知意”,即选有含意的英文单词(或其缩写)作标识符,如count、name、day,month,total,country等,除了数值计算程序外,一般不要用代数符号(如a、b、c、x1、yl 等)作变量名,以增加程序的可读性。这是结构化程序的一个特征。本书在一些简单的举例中,为方便起见,仍用单字符的变量名(如a、b、c等),请读者注意不要在其他所有程序中都如此。
在C语言中,要求对所有用到的变量作强制定义,也就是“先定义,后使用”,如例
1.2、例1.3那样。这样做的目的是:
(1)凡未被事先定义的,不作为变量名,这就能保证程序中变量名使用得正确。例如,如果在定义部分写了
int student;
而在执行语句中错写成statent。如:
statent=30;
在编译时检查出statent未经定义,不作为变量名。因此输出“符号statent未经定义”的信息,便于用户发现错误,避免变量名使用时出错。
- 每一个变量被指定为一确定类型,在编译时就能为其分配相应的存储单元。如指定a、b 为int型,TurboC编译系统为a和b各分配两个字节,并按整数方式存储数据。(3)指定每一变量属于一个类型,这就便于在编译时,据此检查该变量所进行的运算是否合法。例如,整型变量a和b,可以进行求余运算:
a%b
%是“求余”,得到a除以b的余数。如果将a、b指定为实型变量,则不允许进行“求余”运算,在编译时会给出有关“出错信息”。