2012-12-07 22 views
5

नीचे कोड देखें, मैं सिर्फ इतना है कि पीछे कारण को समझने के लिए चाहते हैं ...क्यों सीएलआर ओवरफ्लो कॉन्स संकलित नहीं करता है और चर के लिए यह करता है?

const int a = 2147483647; 
const int b = 2147483647; 

int c = a + b; // it doesn't allow to compile!!! 

int a = 2147483647; 
int b = 2147483647; 

int c = a + b; // it allows to compile!!! 
+0

बस एक अनुमान है, लेकिन निश्चित रूप से क्योंकि वे स्थिरांक हैं, और संकलक निश्चित रूप से देख सकते हैं कि जब वे जोड़े गए * ओवरफ्लो, जबकि एक चर के साथ यह मानों को अज्ञात मानता है। – MadSkunk

+0

साइड नोट: सीएलआर सी # स्रोत कोड संकलित नहीं करता है, यह सी # कंपाइलर का काम है। –

उत्तर

4

const भाव संकलन समय पर हल कर रहे हैं, गैर const भाव कार्यावधि में हल कर रहे हैं। डिफ़ॉल्ट रूप से प्रत्येक के पास विभिन्न प्रकार के अतिप्रवाह जांच संदर्भ होते हैं। सी # विनिर्देश के अनुसार:

गैर निरंतर भाव (भाव कि रन-टाइम में मूल्यांकन किया जाता है) है कि किसी भी जाँच की या अनियंत्रित ऑपरेटरों या बयान से घिरा नहीं कर रहे हैं के लिए, डिफ़ॉल्ट अतिप्रवाह जाँच संदर्भ अनियंत्रित है जब तक बाहरी कारक (जैसे कंपाइलर स्विच और निष्पादन पर्यावरण कॉन्फ़िगरेशन) चेक किए गए मूल्यांकन के लिए कॉल करें।

यही कारण है कि आप अंकगणित करने के लिए स्थानीय चर का उपयोग करते समय रनटाइम त्रुटि नहीं देख रहे हैं। const गणना के लिए के रूप में:

निरंतर भाव (भाव कि पूरी तरह से संकलन समय पर मूल्यांकन किया जा सकता) के लिए, डिफ़ॉल्ट अतिप्रवाह जाँच संदर्भ हमेशा है जाँच की। जब तक निरंतर अभिव्यक्ति को अनचेक संदर्भ में स्पष्ट रूप से रखा जाता है, तो संकलन-समय अभिव्यक्ति का मूल्यांकन हमेशा संकलन-समय त्रुटियों का कारण बनता है।

यही कारण है कि आप अपने const गणना के साथ संकलन-समय त्रुटि देख रहे हैं।

More information about checked and unchecked on MSDN

0

मैं अपने मान क्योंकि compliler जानता है कि const संशोधित नहीं किया जा सकता है ताकि a+b असफल हो जायेगी। लेकिन अन्य चर के साथ उन्हें रनटाइम में बदला जा सकता है, इसलिए शिकायतकर्ता मान लेगा कि मान सेट वैध मान में नहीं बदलेगा।

2

निरंतर मानों के लिए, संकलक अनिवार्य रूप से परिवर्तनीय समय पर निरंतर मान के साथ परिवर्तनीय को प्रतिस्थापित करता है। इसलिए, जब संकलन समय पर अतिरिक्त कथन का मूल्यांकन किया जाता है, तो यह मानों को जानने और ओवरफ्लो स्थिति को देखने में सक्षम होता है।

पूर्णांक प्रकार चर के लिए, मुझे नहीं लगता कि संकलक वास्तव में निर्दिष्ट समय को संकलित समय पर खाते में लेता है, बल्कि रनटाइम पर अभिव्यक्ति का मूल्यांकन करता है।

लेकिन सी #, यह पता चला है कि चेक डिफ़ॉल्ट रूप से अक्षम है। आप इसे विकल्पों में चालू कर सकते हैं। whys पर जस्टिन Etheredge उत्तम ब्लॉग पोस्ट देखें और जानें कि कैसे:

http://www.codethinked.com/c-trivia-what-no-overflow

+0

लेकिन रनटाइम में भी यह अतिप्रवाह स्थिति – RollRoll

+0

हा के लिए अपवाद नहीं फेंकता है - आप सही हैं! ऊपर मेरा संपादन देखें। –