2.1 认识变量与常量
在介绍变量(variable)的正式定义前,先回到我们在第1章中利用printf()函数写的简单程序,现在为这个程序多加几行语句,请读者将【上机实习范例:CH02_01.c】程序自行输入并编译执行,然后从执行结果中反推看看这几行新加的语句有什么功能。再次提醒,程序代码前的行号是作为说明之用,千万别将其当作程序代码输入程序中。
■【上机实习范例:CH02_01.c】
01 #include <stdio.h> 02 #include <stdlib.h> 03 04 int main(void) 05 { 06 int a; /*声明整数类型变量a */ 07 int b; /*声明整数类型变量b */ 08 09 a=5; /*将a的值设定为5*/ 10 b=10; /*将b的值设定为10*/ 11 printf("a=%d b=%d a+b=%d\n",a,b,a+b); 12 /*输出a,b,a+b的值 */ 13 14 return 0; 15 }
执行结果如图2.1所示。
图2.1
执行结果很简单,就是输出a、b、a+b三者的值。各位可以发现其中有几行语句是陌生的,例如第6~7行就是将a与b声明为整数类型变量。其中int是C语言中的关键字,表示声明整数类型,如下所示。
int a; int b;
第9~10行就是分别设定a与b的初始值,第11行的printf()函数中使用了“%d”格式,其功能是以十进制整数格式来输出变量的值。
简单来说,“%d”第一次在printf()函数中出现是对应a的值,第二次出现对应b的值,第三次出现则对应a+b的值,另外printf()函数中两个双引号之间的文字会与这3个“%d”所对应的值一起输出到屏幕上,输出结果如下所示。
a=5 b=10 a+b=15
【上机实习范例:CH02_01.c】告诉我们应该如何声明两个整数变量,并分别输出它们的值与两者相加后的和,相信各位应该对变量的功能有一些了解了吧。
2.1.1 变量的简介
刚刚我们提到的变量是程序语言中最基本的“角色”,也是在程序设计中由编译器所配置的一部分具有名称的内存,用来存储可变的数据内容。如果程序需要存取某个内存的数据内容,就可通过变量将数据从内存中取出或写入。
在使用变量之前,必须先声明它用来存储数据的类型,正确的变量声明格式由数据类型、变量名称与分号所构成,而变量名称各位可以自行定义,并且有声明后再设值与声明时设值两种方式,如下所示。
数据类型 变量名称 1 ,变量名称 2 ,… ,变量名称n; 数据类型 变量名称=初始值;
在C语言中共有整数(int)、浮点数(float)、双精度浮点数(double)及字符(char)4种基本数据类型,可在声明变量时使用,关于这些数据类型的详细说明会在稍后的章节中讲解。
两种声明方式的具体示例如下。
int a; /*声明整数类型变量a,暂时未设定初始值*/ int b=12; /*声明整数类型变量b并直接设定其初始值为12*/
C语言在编译时才会解决变量配置的问题,如果要在C语言中使用变量,一定要事先声明,然后才能使用,否则程序在编译时会出现错误信息。至于是否要设定初始值则没有强制规定,不过最好是在声明变量时就指定它的初始内容,这样也容易增强程序的可读性。
2.1.2 变量的名称
保证程序代码的可读性对一个优秀的程序设计师而言是非常重要的好习惯。虽然变量名称在自行定义时只需符合C语言的规定即可,但是当变量很多时,如果你只是简单取个abc等字母名称,就会让人晕头转向,且会大幅降低程序代码的可读性。你最好在事前多花点心思,取个比较有意义的名字,如sum代表总数、score代表成绩等。
此外,变量的命名必须由英文字母、数字或者下划线“_”所组成,不过首字符可以是英文字母或是下划线,但不可以是数字,也不可以使用-,*$@…等符号或空格符,当然也不能使用与关键字相同的字符。C语言中共有32个关键字,在Dev C++中会以粗黑体表示,如表2.1所示。
表2.1
通常为了提高程序的可读性,笔者建议一般变量以小写字母表示,如name、address等,而常量则以大写字母和下划线“_”表示,如PI、MAX_SIZE。至于函数名称则习惯以小写字母开头,如果由多个英文单词组成,则其他英文单词开头字母用大写,如copyWord、calSalary等。
2.1.3 变量的地址
当在程序中声明变量时,编译器会依照这个变量的数据类型所占用的字节数分配部分内存空间给这个变量,例如整数变量占用4字节,而浮点数变量则占用8字节。这个变量一旦声明后,就会占用这个内存空间(也就是地址),不论内容如何改变,地址都不变,如图2.2所示。
图2.2
由于C语言中的数据类型所占用的字节不同,因此如果各位想知道某个变量到底占用了几字节,C语言中的关键字sizeof就能派上用场了,使用格式如下。
sizeof变量或常量名称; sizeof(变量或常量名称);
以下程序就是利用sizeof来查询整数变量与整数类型所占用的字节数目。
■【上机实习范例:CH02_02.c】
01 #include<stdio.h> 02 #include<stdlib.h> 03 04 int main(void) 05 { 06 int salary=100;/*声明为整数类型*/ 07 08 printf( "salary的数据长度=%d字节\n",sizeof salary); /*不加括号 */ 09 printf( "整数类型的数据长度=%d字节\n",sizeof(int)); /*加上括号 */ 10 11 return 0; 12 }
执行结果如图2.3所示。
图2.3
程序解说
第8~9行中利用sizeof关键字来输出变量salary与整数类型数据所占用的内存空间,虽然sizeof后面接不接括号都可以,但如果是查询某些数据类型所占的位数,就一定要接括号了。
2.1.4 常量的简介
常量是指程序在执行的整个过程中不能被改变的数值,例如整数常量45、-36、10005、0等,或者浮点数常量0.56、-0.003、1.234E2等。在C语言中,如果是字符常量,还必须用单引号引起来,如'a' 'c'。当常量为字符串时,必须用双引号引住字符串,如"apple" "salary"等,它们都算是一种字符串常量。下面的a是一个变量,15则是一个常量。
int a; a=a+15;
常量在C语言程序中也如同变量一般,可以用一个符号来表示。在程序执行时,绝对无法改变的常量我们称为“符号常量”,符号常量可以放在程序内的任何位置,但是一定要先声明定义后才能使用,通常这样做也是为了提高程序的可读性。请利用关键字const和预处理器中的#define指令来声明符号常量。声明语法如下。
方式1: const数据类型 常量名称=常量值; 方式2: #define常量名称 常量值
请注意,由于#define为宏指令,并不是指定语句,因此不用加上“=”与“;”。以下两种方式都可定义常量。
const int radius=10; #define PI 3.14159
Tips
所谓宏,又称为“替代指令”,主要功能是用简单的名称取代某些特定常量、字符串或函数,善用宏可以节省不少程序开发的时间。
各位可能会好奇,这两种声明方式到底有什么区别?最大不同点是使用#define指令来定义常量后,会在程序编译时,直接将程序中的所有PI都替换成3.14159;而const常量,本质上可以看作是一个只读变量,需要指定类型,需要分配内存,有自己的作用域。
■【上机实习范例:CH02_03.c】
01 #include<stdio.h> 02 #include<stdlib.h> 03 04 #define PI 3.14159 /*声明PI为 3.14159*/ 05 06 int main() 07 { 08 09 const int radius =10; /*声明圆半径为整数常量*/ 10 11 printf("PI=%f\n",PI);/* %f为浮点数输出格式 */ 12 printf("圆的半径=%d ,面积=%f \n",radius,PI*radius*radius); 13 14 return 0; 15 }
执行结果如图2.4所示。
图2.4
程序解说
这个程序的目的是让各位了解使用符号常量的声明方法,它们被声明后在程序中绝对不能再改变,例如,如果在第10行加一行语句const int radius =15,编译时就会出现错误。第12行printf()函数中所用的“%f”也是一种格式化字符,作用是输出浮点数的数值。
不过有一种情况例外,例如下面这个程序,我们在main()函数中声明了一个const模式的常量salary,但如果在更小的程序区块中(利用{})重新声明一个const模式的常量salary,就可以改变其值,不过离开此区块后,salary又会恢复为原来的数值。
■【上机实习范例:CH02_04.c】
01 #include<stdio.h> 02 #include<stdlib.h> 03 04 int main(void) 05 { 06 const int salary=23000;/*声明salary为常量 */ 07 08 printf("salary=%d\n",salary); 09 10 { 11 const int salary=33000; 12 printf("salary=%d\n",salary); 13 }/*在此程序区块中重新声明salary常量,可改变其值 */ 14 15 printf("salary=%d\n",salary); 16 17 return 0; 18 }
执行结果如图2.5所示。
图2.5
程序解说
我们知道C语言中的程序区块是由一对大括号括起来的,包含单行或多行程序语句,程序区块中还可以包含更小的程序区块,这时每个区块中所定义的变量或常量就会有生命周期,所以各位会发现在第12、15行中所输出的salary值并不相同。这部分内容在后面关于函数的章节中会详细说明。