21天学通C语言
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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个字符,则继续占用后续位置。

警告:使用变量时务必要对其初始化。