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')。

1 C 中声明的未初始化变量会发生什么?它有价值吗?

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 中是不合法的。