दिलचस्प पोस्ट
ऑफसेट + सीमा के साथ मेरी एसक्यूएल क्वेरी में कुल परिणाम देखें पायथन डिक्शनिक्स में कुंजी ऑर्डर आप युग काल को सी # में कैसे परिवर्तित कर सकते हैं? यह निर्धारित करने के लिए कि क्या बहुभुज बिंदुओं की एक सूची दक्षिणावर्त क्रम में है? क्या एएनएसआई सी में पैरों के भाव से घेरे हुए मिश्रित बयानों (ब्लॉक) हैं? ?: एक अभिव्यक्ति खाली छोड़ते समय टर्नरी सशर्त ऑपरेटर व्यवहार ASP.NET से सभी ब्राउज़र के लिए ब्राउज़र कैशिंग अक्षम करना सीएसएस: कुछ तत्वों को सामग्री जोड़ने के बाद नहीं पायथन 3 के लिए छवि पुस्तकालय mysql कॉलम के नामों के रूप में गतिशील पंक्ति मानों का चयन करें, मूल्य के रूप में एक अन्य स्तंभ तत्व के मुताबिक माउस की स्थिति का पता लगाएं सिंक्रनाइज़ेशन और सिस्टम। आउट.प्रिंटलाइन जावा में लिंक्ड सूची की एक सरणी नहीं बना सकता …? पायथन स्मृति लीक रेल 4 टर्बो-लिंक जेपीसी स्क्रिप्ट को काम से रोकता है

क्या होगा यदि आप static_cast enum वर्ग के लिए अमान्य मान?

इस C ++ 11 कोड पर विचार करें:

enum class Color : char { red = 0x1, yellow = 0x2 } // ... char *data = ReadFile(); Color color = static_cast<Color>(data[0]); 

मान लीजिए कि डेटा [0] वास्तव में 100 है। मानक के अनुसार रंग क्या है? विशेष रूप से, अगर मैं बाद में करता हूं

 switch (color) { // ... red and yellow cases omitted default: // handle error break; } 

मानक गारंटी है कि डिफ़ॉल्ट हिट हो जाएगा? यदि नहीं, तो यहां त्रुटि की जांच करने के लिए सबसे उपयुक्त, सबसे कुशल, सबसे खूबसूरत तरीका क्या है?

संपादित करें:

एक बोनस के रूप में, क्या मानक इस बारे में कोई गारंटी देता है, लेकिन सादे मात्रा के साथ?

वेब के समाधान से एकत्रित समाधान "क्या होगा यदि आप static_cast enum वर्ग के लिए अमान्य मान?"

मानक के अनुसार रंग क्या है?

मानक से एक उद्धरण के साथ उत्तर:

[Expr.static.cast] / 10

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

चलो गणना मूल्यों की श्रेणी देखें : [dcl.enum] / 7

जिनकी अंतर्निहित प्रकार तय की गई है एक गणण के लिए, गणना के मूल्यों अंतर्निहित प्रकार के मूल्य हैं।

सीडब्ल्यूजी 1766 से पहले , data[0] == 100 , परिणामस्वरूप मान (*) निर्दिष्ट है, और कोई अपरिभाषित व्यवहार (यूबी) शामिल नहीं है। अधिक सामान्यतः, जैसा कि आप अंतर्निहित प्रकार से गणना प्रकार तक डाले हैं, data[0] में कोई भी मान static_cast लिए यूबी तक नहीं static_cast

सीडब्ल्यूजी 1766 के बाद सीडब्ल्यूजी दोष 1766 देखें [Expr.static.cast] p10 पैराग्राफ को मजबूत किया गया है, इसलिए यदि आप मान को मान देते हैं जो enum प्रकार के लिए एक enum के प्रतिनिधित्व योग्य रेंज के बाहर है तो अब आप यूबी खोलें।

(*) char कम से कम 8 बिट चौड़े होना आवश्यक है, लेकिन unsigned होने की आवश्यकता नहीं है C99 मानक के अनुलग्नक ई के लिए कम से कम 127 लिए अधिकतम मूल्य मानना ​​आवश्यक है।


[एक्सप्र] / 4 से तुलना करें

यदि किसी अभिव्यक्ति के मूल्यांकन के दौरान, परिणाम गणितीय परिभाषित नहीं है या इसके प्रकार के लिए प्रतिनिधित्व योग्य मानों की श्रेणी में नहीं है, तो व्यवहार अनिर्धारित है।

तो यह आसानी से यूबी हो सकता है यदि मूल्य काफी बड़ा था, जैसे कि static_cast<Color>(10000);


अब, switch स्टेटमेंट:

[Stmt.switch] / 2

हालत अभिन्न प्रकार, गणण प्रकार या वर्ग प्रकार का होनी चाहिए। […] अभिन्न प्रचार किया जाता है।

[Conv.prom] / 4

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

नोट: एक स्कॉड एनआईएम वाई / ओ एंम-बेस का अंतर्निहित प्रकार int अनसॉप्ड एनमों के लिए अंतर्निहित प्रकार कार्यान्वयन-परिभाषित है, लेकिन int से बड़ा नहीं होगा यदि int में सभी एन्युमेमेटर के मान शामिल हो सकते हैं।

एक अनसॉक्टेड गणना के लिए , यह हमें 1/1 की ओर ले जाता है

bool , char16_t , char32_t , या वॉचर_टी के अलावा किसी अन्य पूर्णांक प्रकार का एक char16_t , जिसका पूर्णांक रूपांतरण रैंक (4.13) इंटरेड रैंक से कम है, उसे int रूप में परिवर्तित किया जा सकता है यदि int स्रोत प्रकार के सभी मानों का प्रतिनिधित्व कर सकता है ; अन्यथा, स्रोत प्राइवल को प्रकार unsigned int प्राइव्यू में परिवर्तित किया जा सकता है

एक अनसॉक्टेड गणना के मामले में, हम यहां इंट्रोड के साथ व्यवहार करेंगे। स्कॉड एन्यूमरेशन ( enum class और enum struct ) के लिए, कोई अभिन्न प्रचार लागू नहीं होता है। किसी भी तरह, अभिन्न पदोन्नति यूबी तक नहीं जाती है, क्योंकि संचयित मूल्य अंतर्निहित प्रकार की सीमा में है और int की सीमा में है।

[Stmt.switch] / 5

जब switch स्टेटमेंट निष्पादित होता है, इसकी स्थिति का मूल्यांकन किया जाता है और प्रत्येक केस स्थिरांक के साथ तुलना की जाती है। अगर केस स्थिरांक में से एक स्थिति के मूल्य के बराबर है, तो मिलान case लेबल के बाद कथन के पास नियंत्रण पारित किया गया है। अगर कोई भी case लगातार शर्त से मेल नहीं खाती है, और यदि कोई default लेबल है, तो default लेबल द्वारा लेबल किए गए स्टेटमेंट को नियंत्रित करता है।

default लेबल को हिट करना चाहिए

नोट: एक दूसरे ऑपरेटर पर तुलना कर सकता है, लेकिन इसका उल्लेख "संदर्भ" में स्पष्ट रूप से नहीं किया गया है। वास्तव में, यह कोई संकेत नहीं है कि यह हमारे मामले में स्कॉप्ड या अनसॉप्ड एनम के लिए यूबी का परिचय देगा।


एक बोनस के रूप में, क्या मानक इस बारे में कोई गारंटी देता है, लेकिन सादे मात्रा के साथ?

चाहे या नहीं enum स्कॉड है यहाँ कोई अंतर नहीं है। हालांकि, अंतर्निहित प्रकार तय हो गया है या नहीं, यह एक फर्क पड़ता है। पूर्ण [decl.enum] / 7 है:

जिनकी अंतर्निहित प्रकार तय की गई है एक गणण के लिए, गणना के मूल्यों अंतर्निहित प्रकार के मूल्य हैं। अन्यथा, एक गणन के लिए जहां न्यूनतम छोटा गणक है और अधिकतम सबसे बड़ा है, गणण के मूल्य, बी न्यूनतम बी में अधिकतम मूल्य हैं , जो निम्नानुसार परिभाषित हैं: दो दो पूरक प्रस्तुति के लिए K 1 दें और 0 के पूरक या संकेत-परिमाण के प्रतिनिधित्व के लिए बी मैक्स अधिकतम (| ई मिनट | – K , | अधिकतमतम ) के बराबर या उससे कम के बराबर मूल्य है और 2 एम -1 के बराबर है, जहां M एक गैर-नकारात्मक पूर्णांक है बी मिनट शून्य है यदि मिनट गैर-नकारात्मक है और – (बी अधिकतम + K ) अन्यथा

सौभाग्य से, आपकी गणक का सबसे छोटा गणक red = 0x1 , इसलिए अधिकतम (| ई न्यूनतम | – K , | e max |) बराबर है | ई अधिकतम | किसी भी मामले में, जो yellow = 0x2 सबसे बड़ा मूल्य बड़ा या 2 बराबर है, जो एक सकारात्मक पूर्णांक M 3 ( 2 2 – 1 ) के लिए 2 एम -1 के बराबर है। (मुझे लगता है कि इरादा सीमा से 1-बिट-चरणों में सीमा की अनुमति देना है।) यह निम्नानुसार है कि बी अधिकतम 3 और बीएमटी 0

इसलिए, 100 static_cast की सीमा के बाहर होगा, और static_cast अनिर्दिष्ट मूल्य का उत्पादन करेगा, जो [एक्सप्र] / 4 के अनुसार यूबी तक पहुंच सकता है।