Scalar initialization
초기화 과정에서 스칼라 타입 의 객체를 초기화할 때, 초기화자는 단일 표현식이어야 합니다
스칼라(정수형(불리언 및 열거형 포함), 부동소수점형(복소수 및 허수 포함), 포인터형(함수 포인터 포함) 객체)의 초기화자는 단일 표현식이어야 하며, 선택적으로 중괄호로 둘러싸일 수 있습니다 , 또는 빈 초기화자 (C23부터) :
=
expression
|
(1) | ||||||||
=
{
expression
}
|
(2) | ||||||||
=
{
}
|
(3) | (C23부터) | |||||||
참고 사항
대입에 의한 변환에 적용되는 규칙 때문에,
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 초기화