标量初始化
来自 cppreference.cn
标量(整数类型(包括布尔类型和枚举类型)、浮点类型(包括复数和虚数)以及指针类型(包括函数指针))的初始化器必须是单个表达式,可以选择用花括号括起来,或空初始化器(自 C23 起)
= 表达式 |
(1) | ||||||||
= { 表达式 } |
(2) | ||||||||
= { }
|
(3) | (自 C23 起) | |||||||
1,2) 表达式会被求值,并且其值在转换(如同赋值给对象类型)之后,会成为被初始化对象的初始值。
3) 对象会被空初始化,即,对于算术或枚举类型的对象初始化为数值零,或者对于指针类型的对象初始化为空指针值。
[编辑] 注释
由于适用于如同赋值的转换规则,当确定要将表达式转换为哪种类型时,会忽略声明类型上的const
和volatile
限定符。
有关不使用初始化器时应用的规则,请参阅初始化。
与所有其他初始化一样,当初始化静态或线程局部存储期的对象时,表达式必须是常量表达式。
表达式不能是逗号运算符(除非用括号括起来),因为顶层逗号会被解释为下一个声明符的开始。
当初始化浮点类型的对象时,对于具有自动存储期的对象,所有计算都如同在执行时完成,并且受当前舍入模式的影响;浮点错误会按照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 初始化 (页: 101)
- C11 标准 (ISO/IEC 9899:2011)
- 6.7.9/11 初始化 (页: 140)
- C99 标准 (ISO/IEC 9899:1999)
- 6.7.8/11 初始化 (页: 126)
- C89/C90 标准 (ISO/IEC 9899:1990)
- 6.5.7 初始化