命名空间
变体
操作

标量初始化

来自 cppreference.cn
< c‎ | language

初始化标量类型的对象时,初始化器必须是单个表达式

标量(整数类型对象,包括布尔型和枚举类型;浮点类型,包括复数和虚数;以及指针类型,包括函数指针)的初始化器必须是单个表达式,可选地用花括号括起来,或者是一个空的初始化器(C23 起)

= 表达式 (1)
= { 表达式 } (2)
= { } (3) (自 C23 起)
1,2) 表达式被求值,其值在如同通过赋值进行转换为对象类型后,成为被初始化对象的初始值。
3) 对象被空初始化,即对于算术或枚举类型的对象,初始化为数值零;对于指针类型的对象,初始化为空指针值。

[编辑] 注意

由于适用于如同通过赋值进行转换的规则,在确定将表达式转换为哪种类型时,声明类型上的constvolatile限定符会被忽略。

有关未提供初始化器时适用的规则,请参阅初始化

与所有其他初始化一样,当初始化具有静态或线程局部存储期的对象时,表达式必须是常量表达式

表达式不能是逗号运算符(除非用括号括起来),因为顶层的逗号将被解释为下一个声明符的开始。

当初始化浮点类型对象时,所有对具有自动存储期的对象的计算都如同在执行时进行,并受当前舍入模式影响;浮点错误按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
}

[编辑] 参考

  • C17 标准 (ISO/IEC 9899:2018)
  • 6.7.9/11 初始化 (p: 101)
  • C11 标准 (ISO/IEC 9899:2011)
  • 6.7.9/11 初始化 (p: 140)
  • C99 标准 (ISO/IEC 9899:1999)
  • 6.7.8/11 初始化 (p: 126)
  • C89/C90 标准 (ISO/IEC 9899:1990)
  • 6.5.7 初始化