C
C 语法

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 }