Scalar initialization
标量初始化
初始化标量类型的对象时,初始化程序必须是单个表达式。
标量的初始化器(包括布尔值和枚举类型的整数类型对象,包括复数和虚数的浮点类型以及包含指向函数的指针类型)必须是单个表达式,可以使用大括号括起来:
= expression | (1) | |
---|---|---|
= { expression } | (2) | |
对表达式进行评估,并且其转换后的值(如同通过分配给对象的类型一样)将成为初始化对象的初始值。
注意
由于适用于转换的规则就像通过赋值一样,所以在确定将表达式转换为哪种类型时,将忽略声明类型的const和volatile限定符。
请参阅不使用初始化程序时适用的规则的初始化。
与所有其他初始化一样,在初始化静态或线程局部存储持续时间的对象时,expression必须是常量表达式。
表达式不能是逗号运算符(除非用括号括起来),因为顶层的逗号将被解释为下一个声明符的开始。
当初始化浮点类型的对象时,具有自动存储持续时间的对象的所有计算都将执行为 - 如果在执行时并且受当前舍入影响; 按照math_errhandling中的指定报告浮点错误。对于静态和线程局部存储持续时间的对象,如果在编译时计算完成,并且不会引发异常:
void f(void)
{
#pragma STDC FENV_ACCESS ON
static float v = 1.1e75; // does not raise exceptions: static init
float u[] = { 1.1e75 }; // raises FE_INEXACT
float w = 1.1e75; // raises FE_INEXACT
double x = 1.1e75; // may raise FE_INEXACT (depends on FLT_EVAL_METHOD)
float y = 1.1e75f; // may raise FE_INEXACT (depends on FLT_EVAL_METHOD)
long double z = 1.1e75; // does not raise exceptions (conversion is exact)
}
例
#include <stdbool.h>
int main(void)
{
bool b = true;
const double d = 3.14;
int k = 3.15; // conversion from double to int
int n = {12}, // optional braces
*p = &n, // non-constant expression OK for automatic variable
(*fp)(void) = main;
enum {RED, BLUE} e = RED; // enumerations are scalar types as well
}