3.2.4 赋值和初始化
赋值是指为变量设定一个数值的过程。在变量的使用过程中,对函数赋值是十分频繁的操作。对变量赋值最主要的方式是使用赋值表达式,形式如下:
变量名 = 值;
其中,等号为赋值操作符,赋值操作符右边的值可能是变量的值,可能是常量的值,也可能是其他表达式的值。该语句会将值赋值给等号左边的变量名代表的变量。例如:
01 int a; 02 double b; 03 char c; 04 05 a = 2; /* 给a赋值 */ 06 b = 3.2; /* 给b赋值 */ 07 c = 'c'; /* 给c赋值 */
在上面的第5~7行,分别为变量a、b和c赋值。语句执行后,a、b和c的值分别为2、3.2和'c'。而第1~3 行是三个变量的定义,在这个过程中,编译器会为它们分配内存空间。变量在得到内存空间时会自动继承一个数值,即该内存空间当前保存的内容。由于程序在定义之前无法知道该内容,因此,此时变量会被赋值为是一个不可知的混乱值;如果在这时使用该变量值,那么,很可能会得到不可预期的结果。
在某些情况下,编译器会在分配内存后自动对该内存空间进行赋值。对于C语言中的某些变量,编译器会自动为其初始化。这种情况下,编译器会将变量的内存空间所有二进制位清零。但是,大部分的变量需要程序员在程序中以赋值的形式为其显式初始化。形式如下:
数据类型名 变量名 = 初始值;
其中,初始值可以由程序员设定。使用初始化的方法,以上三个变量的赋值可以改写为:
01 int a = 2; 02 double b = 3.2; 03 char c = 'c';
注意:定义变量时要对变量进行初始化,以避免混乱值的使用。未初始化是程序Bug的根源之一。
可以在一个语句中定义多个同类型的变量,形式如下:
数据类型名 变量1, 变量2, 变量3 …;
例如,要定义三个int型变量,可以写为:
int a, b, c;
但若要在一个语句中初始化多个变量,仍需挨个为其赋值。例如:
int a = 2, b = 2, c = 2;
若只在末尾赋值,如下所示:
int a, b, c = 2;
那么,只有c被赋值为2,变量a和b的值仍然未被初始化,为不可知值。范例3-5比较了初始化的变量和未初始化的变量。
【范例3-5】展示了初始化的变量和未初始化的变量,实现方法如示例代码3-5所示。
示例代码3-5
01 #include <stdio.h> 02 03 int main(void) { 04 int x; /* 定义x但不对齐初始化 */ 05 int y = 2; /* 定义并初始化y */ 06 07 int a, b, c = 3; /* 定义3个变量,只初始化c */ 08 int i = 3, j = 3, k = 3; /* 定义3个变量,并全部初始化 */ 09 10 printf("x = %-8d y = %-8d\n", x, y); /* 输出x和y的值 */ 11 printf("a = %-8d b = %-8d c = %-8d\n", a, b, c); /* 输出a、b和c的值 */ 12 printf("i = %-8d j = %-8d k = %-8d\n", i, j, k); /* 输出i、j和k的值 */ 13 14 return 0; 15 }
【运行结果】本程序编译后有如下警告信息:
.\3-5.c(10) : warning C4700: uninitialized local variable 'x' used .\3-5.c(11) : warning C4700: uninitialized local variable 'b' used .\3-5.c(11) : warning C4700: uninitialized local variable 'a' used
产生警告的原因是,变量a、b和c未初始化,由于这是程序有意而为的,故忽略之。在Visual C++ 2005环境下的运行程序,可得结果如图3-5所示。
图3-5 范例3-5在Visual C++ 2005中的运行结果
【代码解析】第4行的变量x、第7行的变量a和b都未初始化,因此,它们的值由其分配的内存状况决定。比较两种环境下的运行结果,这三个变量的值是不稳定,不可靠的。
另外,程序第10行、第11行和第12行的printf函数中“%-8d”的作用为定义输出格式,使输出的int型数据至少占8个位置,且从8个位置的最左端开始摆放。如果显示的数据少于8个字符,则添加空格补足8个位置;如果显示的数据多余8个字符,则继续占用后续位置。
警告:使用变量时务必要对其初始化。