名稱空間
變體
操作

標量初始化

來自 cppreference.com
< 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 初始化