变量


字面常量存储于内存之中,并与一个数据类型相关联,若要将一个数值存储在内存中,并在稍后再取回这个数值来使用,该如何进行?显然地,你无法获取方才写下的字面常数,因为没有任何关于字面常数存储位置的信息。

变量(Variable)提供具名称的内存存储空间,一个变量关联一个数据类型、存储的值与存储空间的地址值。

变量数据类型决定了变量分配到的内存大小;变量存储的值是指存储于内存中的某个数值,你可以透过变量名称获取这个数值,这个数值又称为 rvalue 或 read value;而存储空间的地址值则是指变量分配到的内存位置,变量本身又称为 lvalue 或 location value。

在 C 中要使用变量,必须先定义变量名称与数据类型,例如:

int age;       // 定义一个整数变量
double money;  // 定义一个倍精度浮点数变量

如上面所举的例子,可使用intfloatdoublechar等关键字(Keyword)来定义变量名称并指定数据类型,变量在命名时有些规则,不可以使用数字作为开头,也不可以使用特殊字符,像是 *&^% 之类的字符,而变量名称不可以与 C 内定的关键字同名,例如intfloatstruct等。

在 C 中定义一个变量,就会配置一块内存空间给变量,空间长度依定义时的数据类型而定,被配置的这块空间中原先可能就有数据,也因此变量在定义后的值是不可预期的,所以应该在在变量定义后初始化其值,可以使用指定运算符(Assignment operator)=来指定变量的值,例如:

int ageOfStudent = 0;
double scoreOfStudent = 0.0;
char levelOfStudent = 'A';

这边也看到如何指定字符给字符变量,字符在指定时需使用实参''来包括,在定义变量之后,可以直接使用变量名称来获取存储的值,下面这个程序是个简单的示范:

#include <stdio.h>

int main(void) {
    // 定义变量但未初始化值
    int ageOfStudent;
    double scoreOfStudent;
    char levelOfStudent;
    printf("\n年级\t得分\t等级\n");
    printf("%d\t%f\t%d\n", ageOfStudent, scoreOfStudent, levelOfStudent);

    ageOfStudent = 5;
    scoreOfStudent = 80.0;
    levelOfStudent = 'B';
    printf("\n年级\t得分\t等级\n");
    printf("%d\t%.2f\t%c\n", ageOfStudent, scoreOfStudent, levelOfStudent);

    return 0;
}

在这个程序中首先定义变量,但并没有初始化其值,所以第一次显示时会出现不可预期的数据,而在指定变量的值之后,显示变量值时就会出现指定的数据了,执行结果如下所示:

年级      得分          等级
32767   0.000000    63

年级      得分          等级
5       80.00        B

printf中,针对浮点数的部份,使用格式指定字%f,其中再加上.2,表示显示浮点数时只显示至小数后第二位,更多的格式指定码之使用,将在〈printf 与 scanf〉中介绍。

也可以在使用定义变量后,使用指定运算符将变量的值初始化为 0:

int ageForStudent = 5;
double scoreForStudent = 80.0;
char levelForStudent = 'B';

有时候一但将数值指定给变量之后,就不允许再重新指定给同一变量,这时可以在定义变量时使用const关键字来限定,若程序中有其他代码试图重新设定变量,编译器会先检查出这个错误,例如:

const double PI = 3.14; 
PI = 3.14159;

这一段代码中的PI变量使用了const来限定,所以在指定为10之后,就不可以再指定值给它,所以第二次指定会被编译器指出错误,在gcc编译器下,会出现这样的错误消息:

assignment of read-only variable `PI'

使用const来限定变量,通常就是不希望其他的代码来变动它的值,例如用于循环计数次数的指定(循环之后就会学到),或是像圆周率 PI 的指定。

如果要定义无符号的整数变量,则可以加上unsigned关键字,例如:

unsigned int i;

bool类型的变量虽然也可视为整数类型,但不能在定义变量时加上unsigned来修饰。


展开阅读全文