Namespaces
Variants

Scalar initialization

From cppreference.net

초기화 과정에서 스칼라 타입 의 객체를 초기화할 때, 초기화자는 단일 표현식이어야 합니다

스칼라(정수형(불리언 및 열거형 포함), 부동소수점형(복소수 및 허수 포함), 포인터형(함수 포인터 포함) 객체)의 초기화자는 단일 표현식이어야 하며, 선택적으로 중괄호로 둘러싸일 수 있습니다 , 또는 빈 초기화자 (C23부터) :

= expression (1)
= { expression } (2)
= { } (3) (C23부터)
1,2) 표현식이 평가되고, 그 값은 객체의 타입으로 할당에 의한 변환 과 마찬가지로 변환된 후, 초기화되는 객체의 초기값이 됩니다.
3) 객체는 빈 초기화(empty-initialized) 되며, 즉 산술 또는 열거형 타입의 객체에 대해서는 숫자 0으로, 포인터 타입의 객체에 대해서는 널 포인터 값으로 초기화됩니다.

참고 사항

대입에 의한 변환에 적용되는 규칙 때문에, const volatile 한정자는 선언된 타입에 있을 때 표현식 을 어떤 타입으로 변환할지 결정할 때 무시됩니다.

자세한 내용은 initialization 를 참조하십시오. 초기화자가 사용되지 않을 때 적용되는 규칙에 대한 내용입니다.

다른 모든 초기화와 마찬가지로, expression 은 정적 또는 스레드 지역 storage duration 을 가지는 객체를 초기화할 때 constant expression 이어야 합니다.

표현식 은 최상위 수준의 쉼표가 다음 선언자의 시작으로 해석될 수 있으므로 쉼표 연산자 가 될 수 없습니다 (괄호로 묶인 경우는 제외).

부동 소수점 타입의 객체를 초기화할 때, 자동 저장 기간 을 가진 객체에 대한 모든 계산은 실행 시간에 수행되는 것처럼 처리되며 현재 반올림 모드 의 영향을 받습니다. 부동 소수점 오류는 math_errhandling 에 지정된 대로 보고됩니다. 정적 및 스레드 지역 저장 기간을 가진 객체의 경우, 계산은 컴파일 시간에 수행되는 것처럼 처리되며 예외가 발생하지 않습니다:

void f(void)
{
#pragma STDC FENV_ACCESS ON
    static float v = 1.1e75; // 예외를 발생시키지 않음: 정적 초기화
    float u[] = { 1.1e75 }; // FE_INEXACT를 발생시킴
    float w = 1.1e75;       // FE_INEXACT를 발생시킴
    double x = 1.1e75; // FE_INEXACT를 발생시킬 수 있음 (FLT_EVAL_METHOD에 따라 다름)
    float y = 1.1e75f; // FE_INEXACT를 발생시킬 수 있음 (FLT_EVAL_METHOD에 따라 다름)
    long double z = 1.1e75; // 예외를 발생시키지 않음 (변환이 정확함)
}

예제

#include <stdbool.h>
int main(void)
{
    bool b = true;
    const double d = 3.14;
    int k = 3.15; // double에서 int로의 변환
    int n = {12}, // 선택적 중괄호
       *p = &n,   // 자동 변수에 대해 비상수 표현식 허용
       (*fp)(void) = main;
    enum {RED, BLUE} e = RED; // 열거형도 스칼라 타입입니다
}

참고문헌

  • 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 초기화