C'deki varsayılan enum değerleri tüm derleyiciler için aynı mı?


107

Aşağıda gösterildiği gibi bir enum ilan, tüm C derleyicileri olarak varsayılan değerleri ayarlarım x=0, y=1ve z=2hem Linux ve Windows sistemlerinde?

typedef enum {
    x,
    y,
    z
} someName;

3
Evet, standartlar gereği zorunludur ve eminim ki birisi bunlardan alıntı yapabilir.
Nemo

Yanıtlar:


115

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.


14
ve bu aynı davranış hem C hem de C ++ için gereklidir. C ++ 'da, [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."
Ben Voigt

3
Evet ve ayrıca C harfiyle başlayan C # gibi diğer diller.
James McNellis

70

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.


7

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.


1
mar olması 't'garanti edilmez, harflerin ardışık alfabetik sırada olmadığı karakter kümeleri olabilir
MM

-15

Evet, enum değeri varsayılan olarak 0'dan n'inci öğeye herhangi bir platforma başlar.


14
Cevabınızın cevap havuzuna nasıl katkıda bulunduğunu düşünün. Yani, yeni cevabınız (5 yıl sonra) başka bir cevapta yer almayan yeni bir şeyi nasıl ekler? İlk bakışta, diğer iki yanıttan daha az bilgilendirici görünüyor.
LawfulEvil

2
Ehhh @LawfulEvil rahatlayın. Birden çok yanıt, gelecekte buna bakan kişilere birden fazla perspektif sağlar. Bununla birlikte, bu kötü biçimlendirilmiş, bilgilendirici olmayan bir cevaptır, ancak kendi başlarına ve kendi başlarına geniş cevaplar fena değildir.
Kenny Worden
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.