क्या सी में डिफ़ॉल्ट एनम मूल्य सभी संकलक के लिए समान हैं?


107

जब एक enum की घोषणा के रूप में नीचे दिखाया गया है, सभी सी compilers के रूप में डिफ़ॉल्ट मान सेट करते हैं x=0, y=1और z=2दोनों लिनक्स और विंडोज सिस्टम पर?

typedef enum {
    x,
    y,
    z
} someName;

3
हां, यह मानकों द्वारा आवश्यक है, और मुझे यकीन है कि कोई उन्हें उद्धृत करने में सक्षम होगा।
निमो

जवाबों:


115

हाँ। जब तक आप गणना की परिभाषा में अन्यथा निर्दिष्ट नहीं करते हैं, प्रारंभिक गणनाकर्ता के पास हमेशा मान शून्य होता है और प्रत्येक बाद वाले एन्यूमरेटर का मूल्य पिछले गणनाकर्ता से एक अधिक होता है।


14
और, यह समान व्यवहार C और C ++ दोनों के लिए आवश्यक है। C ++ में, यह है [dcl.enum]: "यदि पहले एन्यूमरेटर के पास कोई इनिशियलाइज़र नहीं है, तो संबंधित कॉन्टिमेंट का मान शून्य होता है। एक एन्यूमराइज़र के बिना एन्यूमरेटर-डेफिनिशन, एन्यूमरेटर को पिछले एन्यूमरेटर का मान एक से बढ़ाकर प्राप्त मान देता है।"
बेन वोइग्ट

3
हां, और अन्य भाषाएं जो अक्षर C से शुरू होती हैं, जैसे C #।
जेम्स मैकनेलिस

70

C99 मानक

N1265 C99 मसौदा 6.7.2.2/3 "गणन विनिर्देशक" में कहते हैं

एक एन्यूमरेटर = अपनी अभिव्यक्ति को निरंतर अभिव्यक्ति के मूल्य के रूप में परिभाषित करता है। यदि पहले एन्यूमरेटर की कोई संख्या नहीं है =, तो इसके एन्यूमरेशन कॉन्स्टैंट का मान 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

उबंटू 16.04, जीसीसी 6.4.0 में परीक्षण किया गया।


7

यदि एनम चर का पहला मान आरंभ नहीं किया गया है, तो सी संकलक स्वचालित रूप से मान 0. असाइन करता है। संकलक 1 से आगे बढ़ने वाले Enum चर का मान बढ़ाता रहता है।

उदाहरण के लिए:

enum months{jan,feb,mar}

व्याख्या: जान का मूल्य ० होगा, फेब १ होगा, विवाह २ होगा।

enum months{jan=123,feb=999,mar}

स्पष्टीकरण: जन का मान 123 होगा, फ़ेब 999 होगा, विवाह 1000 होगा।

enum months{jan='a',feb='s',mar}

स्पष्टीकरण: जन का मान 'ए' होगा, फेब 'एस' होगा, मार्च 'टी' होगा।


1
विवाह की 't'गारंटी नहीं है, वर्ण सेट हो सकते हैं जिसमें अक्षर लगातार वर्णमाला क्रम में नहीं हैं
एमएम

-15

हाँ, Enum value bydefult किसी भी प्लेटफ़ॉर्म पर 0 से n'th एलिमेंट से शुरू होती है।


14
विचार करें कि आपका उत्तर उत्तरों के पूल में कैसे जुड़ता है। यही है, आपका नया उत्तर (5 साल बाद) कुछ नया कैसे जोड़ता है जो किसी अन्य उत्तर में शामिल नहीं है? पहली नज़र में, यह अन्य दो उत्तरों की तुलना में कम जानकारीपूर्ण लगता है।
लॉफुलएविल

2
एहह @ लवफुलविल आराम करो। एकाधिक उत्तर लोगों को भविष्य के कई दृष्टिकोणों को देखते हुए देते हैं। उस ने कहा, यह एक खराब-स्वरूपित, एकरूपतापूर्ण उत्तर है, लेकिन अपने आप में पर्याप्त जवाब खराब नहीं हैं।
केनी वर्डेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.