2010-07-16 6 views
6

में अंकगणितीय अपवाद क्यों सी # उदाहरण में एक वैध, संकलित करने योग्य है और केवल उदाहरण देगा बी उदाहरण संकलित नहीं करेगा?सी #

एक

int val = 0; 
val = val + Int32.MaxValue +2; 

या

int val = Int32.MaxValue; 
val++; 

बी

int val = 0; 
val = 2147483647 + 1; 

या

int val = 0; 
int val = Int32.MaxValue + 1; 

मुझे पता है डिफ़ॉल्ट रूप से कि अंकगणितीय अपवाद डिफ़ॉल्ट रूप से चेक नहीं किए जाते हैं जब तक आप कॉन्फ़िगरेशन में चेक विधि, ब्लॉक या विशेषता का उपयोग करके स्पष्ट रूप से ऐसा नहीं करते हैं। मेरा प्रश्न कंपाइलर से अधिक संबंधित है तो अंकगणित अपवाद कैसे होता है।

+1

मैं तुम्हें soemthing याद किया, जबकि प्रश्न पोस्ट करने लगता है। क्या के बाद "मेरा प्रश्न __________ के लिए और अधिक संबंधित है" क्या है? – bits

+0

@bits हाँ मुझे चियर्स किया –

उत्तर

16

आपके बी उदाहरण संकलन समय पर constant-folded हैं, जो संकलक को इंगित करता है कि यह ओवरफ़्लो की गारंटी है।

क्योंकि आपके ए उदाहरण चर का उपयोग करते हैं, अभिव्यक्तियां पूरी तरह से स्थिर नहीं हो सकती हैं, इसलिए संकलक गारंटी नहीं दे सकता कि मानों का परिणाम ओवरफ़्लो हो जाएगा।

उदाहरण के लिए ...

int val = 0; 
// some other thread changes `val` to -5... 
val = val + Int32.MaxValue +2; // no overflow 

हालांकि, अगर आप जानते हैं कि val परिवर्तन नहीं होगा, और एक const int करने के लिए 0 आवंटित:

const int startval = 0; 
int val = startval + Int32.MaxValue + 2; 

आप अपने compile- प्राप्त कर सकते हैं समय ओवरफ़्लो वापस जांचें क्योंकि मान पूरी तरह से निर्धारित किया जा सकता है और इसलिए निरंतर-फोल्ड किया जा सकता है।

1

इसे बस संकलन समय की जांच की सीमाओं के साथ करना है। कुछ चीजें केवल रनटाइम पर ही जानी जा सकती हैं।

3

मुझे पता है कि अंकगणित अपवाद डिफ़ॉल्ट रूप से चेक नहीं कर रहे हैं जब तक आप स्पष्ट इसलिए का उपयोग विधि, ब्लॉक या विशेषता config में जाँच करना

आप पता नहीं है कि क्योंकि इस कथन गलत है। और वास्तव में आप इसे गलत मानते हैं क्योंकि आपने एक मामला प्रदान किया है जहां आपका कथन गलत साबित हुआ है!

मैं सी # विनिर्देश की धारा 7.6.12 का उल्लेख, इसका एक हिस्सा है जिसमें से मैं आपकी सुविधा के लिए यहां पुन: पेश:

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

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

अधिक जानकारी के लिए कल्पना देखें।

+0

मेला बहुत हो कि बयान "रनटाइम पर" कहना चाहिए –