जब एक enum की घोषणा के रूप में नीचे दिखाया गया है, सभी सी compilers के रूप में डिफ़ॉल्ट मान सेट करते हैं x=0
, y=1
और z=2
दोनों लिनक्स और विंडोज सिस्टम पर?
typedef enum {
x,
y,
z
} someName;
जब एक enum की घोषणा के रूप में नीचे दिखाया गया है, सभी सी compilers के रूप में डिफ़ॉल्ट मान सेट करते हैं x=0
, y=1
और z=2
दोनों लिनक्स और विंडोज सिस्टम पर?
typedef enum {
x,
y,
z
} someName;
जवाबों:
हाँ। जब तक आप गणना की परिभाषा में अन्यथा निर्दिष्ट नहीं करते हैं, प्रारंभिक गणनाकर्ता के पास हमेशा मान शून्य होता है और प्रत्येक बाद वाले एन्यूमरेटर का मूल्य पिछले गणनाकर्ता से एक अधिक होता है।
[dcl.enum]
: "यदि पहले एन्यूमरेटर के पास कोई इनिशियलाइज़र नहीं है, तो संबंधित कॉन्टिमेंट का मान शून्य होता है। एक एन्यूमराइज़र के बिना एन्यूमरेटर-डेफिनिशन, एन्यूमरेटर को पिछले एन्यूमरेटर का मान एक से बढ़ाकर प्राप्त मान देता है।"
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 में परीक्षण किया गया।
यदि एनम चर का पहला मान आरंभ नहीं किया गया है, तो सी संकलक स्वचालित रूप से मान 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}
स्पष्टीकरण: जन का मान 'ए' होगा, फेब 'एस' होगा, मार्च 'टी' होगा।
't'
गारंटी नहीं है, वर्ण सेट हो सकते हैं जिसमें अक्षर लगातार वर्णमाला क्रम में नहीं हैं
हाँ, Enum value bydefult किसी भी प्लेटफ़ॉर्म पर 0 से n'th एलिमेंट से शुरू होती है।