गणना स्थिरांक का प्रकार क्या है, जब इसका उपयोग अनस्कोप्ड एनम परिभाषा के बाहर किया जाता है?

निम्नलिखित कोड पर विचार करें:

#include <iostream>

enum modes
{
    begin = 0,
    end = 1
};

int main()
{
    std::cout << std::boolalpha
        << std::is_same<unsigned int, typename std::underlying_type<modes>::type>::value
        << std::endl;
    std::cout << sizeof(modes) << std::endl;
    std::cout << (-100 + end) << std::endl;
}

यह मेरी मशीन पर उत्पन्न होता है:

true
4
-99

अब, अगर मैं केवल किसी अन्य एन्यूमरेटर, begin के मान को 2147483648 में बदलता हूं, तो मेरा आउटपुट बन जाता है:

true
4
4294967197

जाहिर है, इसका मतलब है कि, उस प्रकार का end int से unsigned int में बदल गया है, यहां तक ​​कि अंतर्निहित प्रकार का modes अभी भी वही है (यानी unsigned int)।

क्या एनम के संबंध में इंटीग्रल प्रमोशन के लिए कुछ विशेष नियम हैं?

4
Grzegorz Szpetkowski 14 जुलाई 2017, 00:31

2 जवाब

सबसे बढ़िया उत्तर

सी ++ मानक से (7.2 गणना घोषणाएं)

  1. ... एक एनम-स्पेसिफायर के क्लोजिंग ब्रेस के बाद, प्रत्येक एन्यूमरेटर के पास इसके एन्यूमरेशन का प्रकार होता है।...

और (4.5 इंटीग्रल प्रमोशन)

3 एक अनस्कोप्ड एन्यूमरेशन प्रकार का प्रचलन जिसका अंतर्निहित प्रकार निश्चित नहीं है (7.2) को निम्न में से पहले प्रकार के प्रचलन में परिवर्तित किया जा सकता है जो एन्यूमरेशन के सभी मूल्यों का प्रतिनिधित्व कर सकता है (अर्थात, बीमिन से बीमैक्स की सीमा में मान) जैसा कि 7.2 में वर्णित है): int, unsigned int, long int, unsigned long int, long long int, या unsigned long long int। यदि उस सूची में कोई भी प्रकार एन्यूमरेशन के सभी मानों का प्रतिनिधित्व नहीं कर सकता है, तो एक अनस्कोप्ड एन्यूमरेशन प्रकार के प्रचलन को विस्तारित पूर्णांक प्रकार के प्रचलन में परिवर्तित किया जा सकता है, जिसमें सबसे कम पूर्णांक रूपांतरण रैंक (4.13) लंबे समय के रैंक से अधिक है। जिसमें गणना के सभी मूल्यों का प्रतिनिधित्व किया जा सकता है। यदि ऐसे दो विस्तारित प्रकार हैं, तो हस्ताक्षरित एक को चुना जाता है।

8
Vlad from Moscow 14 जुलाई 2017, 00:49

गणना स्थिरांक का प्रकार क्या है, जब इसका उपयोग अनस्कोप्ड एनम परिभाषा के बाहर किया जाता है?

यह निश्चित रूप से गणना प्रकार है। begin का प्रकार modes है। यदि इसका एक अभिन्न प्रकार था, तो एनमों के अभिन्न प्रचार के बारे में आपका प्रश्न समझ में नहीं आता।

क्या एनम के साथ इंटीग्रल प्रमोशन के लिए कुछ विशेष नियम हैं?

ज़रुरी नहीं। आप एनम के अंतर्निहित प्रकार के अभिन्न प्रचार के बारे में सोच रहे हैं, लेकिन यह कुछ अलग है। Enum प्रकार के लिए, आपको enum प्रकार के मान्य मानों की सीमा के बारे में सोचने की आवश्यकता है, जो कि enum के अंतर्निहित प्रकार के मान्य मानों की सीमा से छोटा हो सकता है। क्या int सभी मान्य मानों का प्रतिनिधित्व कर सकता है? अगर ऐसा है, तो आपको इसमें से एक int मिलता है।

2
user743382user743382 14 जुलाई 2017, 00:46