/ / रेंज से बाहर गणना गणना चर मुझे चेतावनी या त्रुटि क्यों नहीं देते? - सी ++, गणना

क्यों सीमा से बाहर गणना चर प्रारंभिक मुझे चेतावनी या त्रुटि नहीं देते हैं? - सी ++, गणना

कोड पर विचार करें:

enum spect{violet,indigo,blue,green=8};
spect band = spect (94);

गणना में सीमा के नियम के अनुसार, ऊपरी सीमा 2 ^ 4-1 = 15 होगी और निचला 0 होगा (Ref: C ++ प्राइमर प्लस बुक)।

परंतु94>15 तो यह एक चेतावनी या त्रुटि देना चाहिए। लेकिन मेरा कार्यक्रम ठीक चल रहा है। क्यूं कर?

उत्तर:

जवाब के लिए 0 № 1

मुझे लगता है कि वह किताब या तो गलत है, या आपने गलत तरीके से समझा है कि वह किस प्रकार के एनम के बारे में कह रही है। C ++ 11 युक्ति कहती है:

§ 7.2

6 एक गणना के लिए जिसका अंतर्निहित प्रकार नहीं हैनिश्चित, अंतर्निहित प्रकार एक अभिन्न प्रकार है जो कर सकता है गणना में परिभाषित सभी प्रगणक मूल्यों का प्रतिनिधित्व करते हैं। यदि कोई अभिन्न प्रकार सभी का प्रतिनिधित्व नहीं कर सकता है एन्यूमरेटर मान, एन्यूमरेशन बीमार है। यह कार्यान्वयन-परिभाषित है जो अभिन्न प्रकार का उपयोग किया जाता है अंतर्निहित प्रकार को छोड़कर, अंतर्निहित प्रकार इससे बड़ा नहीं होगा int जब तक ए का मूल्य प्रगणक में फिट नहीं किया जा सकता int या unsigned int। अगर प्रगणक-सूची खाली है, अंतर्निहित प्रकार है मानो एन्यूमरेशन में 0 के साथ एक एन्यूमरेटर था।

इसके अलावा:

§ 5.2.9

10 अभिन्न या गणना प्रकार का मान हो सकता हैस्पष्ट रूप से एक गणना प्रकार में परिवर्तित। मान है अपरिवर्तित यदि मूल मान गणना मूल्यों (7.2) की सीमा के भीतर है। अन्यथा, परिणाम मान अनिर्दिष्ट है (और उस सीमा में नहीं हो सकता है)। फ्लोटिंग-पॉइंट प्रकार का मान भी परिवर्तित किया जा सकता है एक गणन प्रकार के लिए। परिणामी मूल्य मूल मूल्य को अंतर्निहित में परिवर्तित करने के समान है गणना का प्रकार (4.9), और उसके बाद गणना प्रकार।

मुझे लगता है कि पुस्तक निम्नलिखित खंड को समझाने की कोशिश कर रही होगी:

§ 7.2

7 एक गणना के लिए जिसका अंतर्निहित प्रकार तय हो गया है, गणना के मान हैं अंतर्निहित प्रकार। अन्यथा, एक गणना के लिए जहां मिनट सबसे छोटा प्रगणक है और अधिकतम है सबसे बड़ा, गणना के मान श्रेणी में मूल्य हैं मिनट सेवा मेरे अधिकतम, निम्नानुसार परिभाषित किया गया है: चलो कश्मीर दो के पूरक प्रतिनिधित्व के लिए 1 हो और किसी के पूरक या साइन-परिमाण प्रतिनिधित्व के लिए 0 हो। अधिकतम से छोटा या बड़ा मूल्य है अधिकतम(|मिनट| - कश्मीर, |अधिकतम</ Em>|) और 2 के बराबरएम - 1, जहां एम एक गैर-नकारात्मक पूर्णांक है। मिनट अगर शून्य है मिनट गैर-नकारात्मक है और - (BMAX + कश्मीर) अन्यथा। इसका आकार एन्यूमरेशन प्रकार के सभी मानों को रखने के लिए सबसे छोटा बिट-फ़ील्ड पर्याप्त है अधिकतम(एम, 1) यदि bmin</ Sub> है शून्य और एम + 1 अन्यथा। एक गणना को परिभाषित करना संभव है, जिसमें इसके किसी भी द्वारा परिभाषित नहीं किए गए मान हैं प्रगणक। अगर द प्रगणक-सूची खाली है, एन्यूमरेशन के मान इस प्रकार हैं जैसे एन्यूमरेशन में ए मान 0 के साथ एकल प्रगणक।