3. 变量

变量(Variable)是编程语言中最重要的概念之一,变量是计算机存储器中的一块命名的空间,可以在里面存储一个值(Value),存储的值是可以随时变的,比如这次存个字符'a'下次存个字符'b',正因为变量的值可以随时变所以才叫变量。

常量有不同的类型,因此变量也有不同的类型,变量的类型也决定了它所占的存储空间的大小。例如,以下语句定义了四个变量fredbobjimmytom[4],它们的类型分别是字符型、整型、浮点型:

char fred;
int bob;
float jimmy;
double tom;

浮点型有两种,float是单精度浮点型,double是双精度浮点型,它们之间的区别和转换规则我们将在第 15 章 数据类型详解介绍,在随后的几章中我们只使用double类型,上一节介绍的常量3.14应该看作double类型的常量,printf%f也应该看作格式化double类型的占位符。给变量起名不能太随意了,以上四个变量的名字就不够好,我们猜不出这些变量里可能存的是关于什么的数据。而像下面这样起名就很好:

char firstletter;
char lastLetter;
int hour, minute;

我们可以猜得到这些变量是用来存什么的,前两个变量的取值范围应该是'A'-'Z''a'-'z',变量hour的取值范围应该是0-23,变量minute的取值范围应该是0-59。所以,应该给变量起有意义的名字。从这个例子中我们也看到两个同样类型的变量(hourminute)可以定义在同一行。需要注意,变量的命名有一定限制,规定必须以字母或下划线_(Underscore)开头,后面可以跟若干个字母、数字、下划线,但不能有其它字符。例如这些是合法的变量名:Abc__abc___123。但这些是不合法的变量名:3abcab$。其实这个规则不仅适用于变量名,也适用于所有可以由程序员起名字的语法元素,例如以后要讲的函数名、宏定义、结构体成员名等等,在C语言中这些统称为标识符(Identifier)

另外要注意,表示类型的charintfloatdouble等等虽然符合上述规则,但也不能用作标识符。C语言用这些单词做特殊用途,如果你起个变量名也叫这个就会让编译器无法区分,所以C语言规定了一些单词不允许用作标识符,这些单词称为关键字(Keyword)或保留字(Reserved Word)。通常用于编程的文本编辑器都会高亮显示(Highlight)这些关键字,所以只要小心一点通常不会当作标识符误用了。C99规定的关键字有:

auto  break  case  char  const  continue  default  do  double
else  enum  extern  float  for  goto  if  inline  int  long
register  restrict  return  short  signed  sizeof  static  struct  switch  typedef
union  unsigned  void  volatile  while  _Bool  _Complex  _Imaginary

还有一点要注意,一般来说应避免使用以下划线开头的标识符,以下划线开头的标识符只要不和C语言关键字冲突的都是合法的,但是往往被编译器用作一些功能扩展,C语言库的实现也定义了很多以下划线开头的名字,很容易造成名字冲突,所以除非你对编译器和C语言库特别清楚,一般应避免使用这种标识符。

请记住:理解一个概念不是把定义背下来就行了,一定要理解它的外延和内涵,也就是什么情况属于这个概念,什么情况不属于这个概念,什么情况虽然属于这个概念但作为一种最佳实践(Best Practice)应该避免这种情况,这才算是真正理解了。



[4] 更准确地说是声明了四个变量,定义(Definition)和声明(Declaration)之间的关系是:如果一个声明同时也要求分配存储空间,则称为定义。在下一章我们会看到哪些函数声明同时也是定义,哪些不是定义,以后我们还会看到哪些变量声明不分配存储空间因而不是定义。接下来几章的例子中声明的变量都是分配存储空间的,都用“定义”这个词。