Yanıtlar:
Evet. Numaralandırma tanımında aksini belirtmediğiniz sürece, ilk numaralandırıcı her zaman sıfır değerine sahiptir ve sonraki numaralandırıcının değeri önceki numaralandırıcıdan bir büyüktür.
[dcl.enum]
"İlk numaralandırıcının başlatıcısı yoksa, karşılık gelen sabitin değeri sıfırdır. Başlatıcı olmayan bir numaralandırıcı tanımı, numaralandırıcıya, önceki numaralandırıcının değerini bir artırarak elde edilen değeri verir."
C99 Standardı
N1265 C99 taslak 6.7.2.2/3 "Sayım belirteçleri" diyor
= Olan bir numaralandırıcı, numaralandırma sabitini sabit ifadenin değeri olarak tanımlar. İlk numaralandırıcının no'su varsa,
=
numaralandırma sabitinin değeri 0'dır. No = ile sonraki her numaralandırıcı, numaralandırma sabitini önceki numaralandırma sabitinin değerine 1 ekleyerek elde edilen sabit ifadenin değeri olarak tanımlar. (Numaralandırıcıların = ile kullanılması, aynı numaralandırmadaki diğer değerleri çoğaltan değerlere sahip numaralandırma sabitleri üretebilir.)
Dolayısıyla, aşağıdakiler her zaman uygun uygulamalar için geçerlidir:
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;
}
Derleyin ve çalıştırın:
gcc -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out
Ubuntu 16.04, GCC 6.4.0'da test edilmiştir.
Enum değişkeninin ilk değeri başlatılmazsa, C derleyicisi otomatik olarak 0 değerini atar. Derleyici, önceki enum değişkeninin değerini 1 artırmaya devam eder.
Örneğin:
enum months{jan,feb,mar}
Açıklama: Jan değeri 0, Şubat 1, mar 2 olacak.
enum months{jan=123,feb=999,mar}
Açıklama: Jan değeri 123, Şubat 999, mar 1000 olacak.
enum months{jan='a',feb='s',mar}
Açıklama: Jan değeri 'a', Şubat 's', mar 't' olacak.
't'
garanti edilmez, harflerin ardışık alfabetik sırada olmadığı karakter kümeleri olabilir
Evet, enum değeri varsayılan olarak 0'dan n'inci öğeye herhangi bir platforma başlar.