初始化标量类型时,会将 assignment-expression 该值分配给变量。 分配的转换规则适用。 (有关转换规则的信息,请参阅 类型转换 。
语法
declaration:
declaration-specifiers
init-declarator-list
选择;
declaration-specifiers:
storage-class-specifier
declaration-specifiers
选择
type-specifier
declaration-specifiers
选择
type-qualifier
declaration-specifiers
选择
init-declarator-list:
init-declarator
init-declarator-list
,
init-declarator
init-declarator:
declarator
declarator
=
initializer /* 用于标量初始化 */
initializer:
assignment-expression
只要遵守以下规则,就可以初始化任何类型的变量:
可以在文件范围级别声明的变量进行初始化。 如果未在外部级别显式初始化变量,则默认将其初始化为 0。
常量表达式可用于初始化使用
staticstorage-class-specifier.. 在程序执行开始时,声明要static初始化的变量。 如果未显式初始化全局static变量,则默认将其初始化为 0,并且具有指针类型的每个成员都会分配一个 null 指针。每次执行控件传递到声明它们的块时,都会初始化使用
auto或register存储类说明符声明的变量。 如果从变量声明autoregister中省略初始值设定项,则未定义变量的初始值。 对于自动值和寄存器值,初始值设定项不限于为常量;它可以是涉及以前定义的值的任何表达式,甚至涉及函数调用。外部变量声明和所有
static变量的初始值(无论是外部变量还是内部变量)必须是常量表达式。 有关详细信息,请参阅 常量表达式。 由于任何外部声明的变量或静态变量的地址都是常量,因此可用于初始化内部声明的static指针变量。 但是,变量的auto地址不能用作静态初始值设定项,因为它对于块的每个执行可能有所不同。 可以使用常量或变量值来初始化auto和register变量。如果标识符的声明具有块范围,并且标识符具有外部链接,则声明不能具有初始化。
例子
以下示例演示初始化:
int x = 10;
整数变量 x 初始化为常量表达式 10。
register int *px = 0;
px指针初始化为 0,生成“null”指针。
const int c = (3 * 1024);
此示例使用常量表达式 (3 * 1024) 初始化 c 为由于关键字而无法修改的 const 常量值。
int *b = &x;
此语句使用另一个变量b的地址初始化指针x。
int *const a = &z;
指针使用名为 const,因此只能初始化变量 a ,永远不会修改。 它始终指向同一位置。
int GLOBAL ;
int function( void )
{
int LOCAL ;
static int *lp = &LOCAL; /* Illegal initialization */
static int *gp = &GLOBAL; /* Legal initialization */
register int *rp = &LOCAL; /* Legal initialization */
}
全局变量 GLOBAL 在外部级别声明,因此它具有全局生存期。 局部变量 LOCAL 具有 auto 存储类,并且在执行声明它的函数期间只有一个地址。 因此,不允许尝试使用 static指针变量gp可以初始化为地址,GLOBAL因为该地址始终相同。 同样, *rp 可以初始化,因为 rp 是局部变量,并且可以具有非常量初始值设定项。 每次输入块时, LOCAL 都有一个新地址,然后分配给 rp该地址。