C 中变量的初始化
在没有显式初始化的情况下,外部和 static
变量保证初始化为零; 自动变量(包括 register
变量)具有不确定的 1 (即垃圾)初始值。
标量变量可以通过使用等号和表达式跟随名称来定义:
int x = 1;
char squota = '\'';
long day = 1000L * 60L * 60L * 24L; /* milliseconds/day */
对于 external 和 static
变量,初始值设定项必须是常量表达式 2 ; 在程序开始执行之前,概念上完成初始化一次。
对于 automatic 和 register
变量,初始值设定项不限于常量:它可以是涉及先前定义的值的任何表达式,甚至是函数调用。
例如,请参阅下面的代码段
int binsearch(int x, int v[], int n)
{
int low = 0;
int high = n - 1;
int mid;
...
}
代替
int low, high, mid;
low = 0;
high = n - 1;
实际上,自动变量的初始化只是赋值语句的简写。更喜欢哪种形式主要是品味问题。我们通常使用显式赋值,因为声明中的初始化器更难以查看并且远离使用点。另一方面,只有在可能的情况下才能使用变量。
初始化数组:
可以通过跟随其声明来初始化数组,其中初始化器列表用大括号括起来并用逗号分隔。
例如,要使用每月的天数初始化数组天数:
int days_of_month[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
(注意,1 月在此结构中编码为月零。)
当省略数组的大小时,编译器将通过计算初始值来计算长度,在这种情况下,初始值为 12。
如果数组的初始值设定项少于指定的大小,则对于所有类型的变量,其他的初始值设定项将为零。
拥有太多初始值设定项是错误的。没有标准方法来指定初始化程序的重复 - 但 GCC 有一个扩展来执行此操作。
Version < C99
在 C89 / C90 或更早版本的 C 中,无法在不提供所有前面的值的情况下初始化数组中间的元素。
Version >= C99
使用 C99 及更高版本,指定的初始化程序允许你初始化数组的任意元素,将任何未初始化的值保留为零。
初始化字符数组:
字符数组是初始化的特例; 可以使用字符串代替大括号和逗号表示法:
char chr_array[] = "hello";
是一个较长但相当的简写:
char chr_array[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
在这种情况下,数组大小为六(五个字符加上终止'\0'
)。
2 请注意,常量表达式定义为可在编译时计算的值。所以,int global_var = f();
无效。另一个常见的误解是将 const
限定变量视为常量表达式。在 C 中,const
表示只读,而不是编译时间常数。因此,像 const int SIZE = 10; int global_arr[SIZE];
和 const int SIZE = 10; int global_var = SIZE;
这样的全局定义在 C 中是不合法的。