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

    C语言中的声明(Declaration)有变量声明、函数声明和类型声明三种。如果一个变量或函数的声明要求编译器为它分配存储空间,那么也可以称为定义(Definition),因此定义是声明的一种。在接下来几章的示例代码中变量声明都是要分配存储空间的,因而都是定义,等学到我们会看到哪些变量声明不分配存储空间因而不是定义。在下一章我们会看到函数的定义和声明也是这样区分的,分配存储空间的函数声明可以称为函数定义。从第 7 章 结构体开始我们会看到类型声明,声明一个类型是不分配存储空间的,但似乎叫“类型定义”听起来也不错,所以在本书中“类型定义”和“类型声明”表示相同的含义。声明和语句类似,也是以;号结尾的,但是在语法上声明和语句是有区别的,语句只能出现在{}括号中,而声明既可以出现在{}中也可以出现在所有{}之外。

      我们可以猜得到这些变量是用来存什么的,前两个变量的取值范围应该是'A'~'Z''a'~'z',变量hour的取值范围应该是0~23,变量minute的取值范围应该是0~59,所以应该给变量起有意义的名字。从这个例子中我们也看到两个相同类型的变量(和minute)可以一起声明。

      给变量起名有一定的限制,C语言规定必须以字母或下划线_(Underscore)开头,后面可以跟若干个字母、数字、下划线,但不能有其它字符。例如这些是合法的变量名:Abc__abc___123。但这些是不合法的变量名:3abcab$。其实这个规则不仅适用于变量名,也适用于所有可以由程序员起名的语法元素,例如以后要讲的函数名、宏定义、结构体成员名等,在C语言中这些统称为标识符(Identifier)。

      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标准库特别清楚,一般应避免使用这种标识符,以免造成命名冲突。