답변:
예. 열거 정의에서 달리 지정하지 않는 한 초기 열거 자의 값은 항상 0이고 각 후속 열거 자의 값은 이전 열거 자보다 1이 큽니다.
[dcl.enum]
"첫 번째 열거 자에 이니셜 라이저가 없으면 해당 상수의 값은 0입니다. 이니셜 라이저가없는 열거 자 정의는 이전 열거 자의 값을 1 씩 증가시켜 얻은 값을 열거 자에 제공합니다."
C99 표준
N1265 C99 초안 6.7.2.2/3 "열거 지정자"에서 말한다
=가있는 열거자는 해당 열거 상수를 상수 식의 값으로 정의합니다. 첫 번째 열거 자에 no가 있으면
=
해당 열거 상수 값은 0입니다. =가없는 각 후속 열거자는 이전 열거 상수 값에 1을 더하여 얻은 상수 식의 값으로 열거 상수를 정의합니다. (=과 함께 열거자를 사용하면 동일한 열거에서 다른 값을 복제하는 값이있는 열거 상수가 생성 될 수 있습니다.)
따라서 다음은 항상 준수 구현을 유지합니다.
main.c
#include <assert.h>
#include <limits.h>
enum E {
E0,
E1,
E2 = 3,
E3 = 3,
E4,
E5 = INT_MAX,
#if 0
/* error: overflow in enumeration values */
E6,
#endif
};
int main(void) {
/* If unspecified, the first is 0. */
assert(E0 == 0);
assert(E1 == 1);
/* Repeated number, no problem. */
assert(E2 == 3);
assert(E3 == 3);
/* Continue from the last one. */
assert(E4 == 4);
assert(E5 == INT_MAX);
return 0;
}
컴파일 및 실행 :
gcc -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out
Ubuntu 16.04, GCC 6.4.0에서 테스트되었습니다.
열거 형 변수의 첫 번째 값이 초기화되지 않은 경우 C 컴파일러는 자동으로 값 0을 할당합니다. 컴파일러는 선행 열거 형 변수의 값을 1 씩 계속 증가시킵니다.
예 :
enum months{jan,feb,mar}
설명 : 1 월의 값은 0, 2 월은 1, 3 월은 2입니다.
enum months{jan=123,feb=999,mar}
설명 : jan의 값은 123, feb은 999, mar는 1000입니다.
enum months{jan='a',feb='s',mar}
설명 : jan의 값은 'a', feb은 's', mar는 't'입니다.
't'
은 보장되지 않습니다. 문자가 연속적인 알파벳 순서가 아닌 문자 세트가있을 수 있습니다
예, enum value bydefult는 모든 플랫폼에 대해 0부터 n 번째 요소까지 시작합니다.