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.