2009-12-23 14 views
8

सी # में, निम्न विधि संकलन नहीं होगा:क्यों संकलक इस कोड के साथ अलग व्यवहार करता है?

public bool IsItTrue() 
{ 
} 

संकलक त्रुटियों: 'IsItTrue()': सभी कोड पथ एक मूल्य है, जो एकदम सही समझ में आता है लौटने। लेकिन बिना किसी मुद्दे के निम्नलिखित संकलन।

public bool IsItTrue() 
{ 
    while (true) 
    { 
    } 
} 

जो कोई भी वापसी विवरण के रूप में गलत दिखता है। ऐसा क्यों है? यहां कोई मदद ...,

उत्तर

13

संकलक जानता है कि दूसरी विधि कभी वापस नहीं आएगी।

यदि किसी भी परिस्थिति में कभी भी विधि वापस आती है तो उन्हें bool वापस करना होगा।

पहली विधि में कोई अनंत लूप नहीं है, कोई बिना शर्त अपवाद आदि फेंकता है, इसलिए इसे bool वापस करना होगा। कोड bool वापस नहीं करता है इसलिए संकलक इसे संकलित करने से इंकार कर देता है।

दूसरी विधि कभी भी अनंत while (true) लूप की वजह से वापस नहीं आती है। यदि यह कभी रिटर्न नहीं करता है तो इससे कोई फर्क नहीं पड़ता कि (यदि कुछ भी) वापस नहीं आया है तो संकलक इसे संकलित करने की अनुमति देगा।

कुछ और उदाहरण है कि संकलक समझते हैं और अनुमति देगा:

public bool IsItTrue() 
{ 
    throw new Exception("Always thrown!"); 
} 

public bool HowAboutThisOne() 
{ 
    if ((46 - 3) < (27 * 9)) 
    { 
     throw new Exception("Always thrown!"); 
    } 
} 
+0

कृपया थोड़ा स्पष्टीकरण .., ​​ – Dhana

+0

दिलचस्प है कि संकलक इसे अनुमति देगा।मैं देख सकता हूं कि इसे क्यों * अनुमति दी जा सकती है, लेकिन मुझे आश्चर्य है कि वास्तविक जीवन उद्देश्य क्या करता है। –

+0

मुझे पता है कि हम थ्रेड के लिए थोड़ी देर (सच) के समान कुछ चाहते हैं लेकिन किसी बिंदु पर भी धागा खत्म होना चाहिए? तो यदि संकलक ऐसी स्थिति का पता लगा सकता है तो यह एक त्रुटि बिंदु को अनंत लूप क्यों नहीं फेंकता है? – uriDium

3

पहले संकलक त्रुटि संदेश द्वारा अच्छी तरह से समझाया गया है।

दूसरा कभी भी लौटाता है, इसलिए कभी भी कोई मान वापस नहीं आया है।

यह वही नहीं है। आपके पहले उदाहरण में विधि कॉलर -> कंपाइलर त्रुटि पर कोई मूल्य वापस दिए बिना वापस आ सकती है।

दूसरा कभी वापस नहीं आएगा (संकलक इसके लिए पर्याप्त स्मार्ट है, यह पता चलता है कि आपने अनंत लूप बनाया है)। यह कभी भी "ठीक है, मैं विधि के अंत तक नहीं पहुंच पाया और पता नहीं कि वापस क्या करना है" राज्य में प्रवेश नहीं करेगा।

1

Halting Problem बताता है कि आप आम तौर पर यह निर्धारित नहीं कर सकते कि कोई प्रोग्राम हमेशा समाप्त हो जाएगा या रन करेगा। यह देखते हुए कि इस धागे में ऐसे उदाहरण हैं जो इस सिद्धांत का उल्लंघन करते हैं, मुझे संदेह है कि सी # कंपाइलर लूप स्थितियों पर विश्लेषण कर रहा है जिसे संकलित समय स्थिर पर घटाया जा सकता है। यदि निरंतर true का मूल्यांकन करता है, तो हम जानते हैं कि लूप कभी समाप्त नहीं होगा।

उदाहरण के लिए, निम्नलिखित दो कार्यों पर विचार करें।

public bool NoError() 
{ 
    while (true) { } 
} 

public bool Error() 
{ 
    while (NoError()) { } 
} 

जैसा कि दिखाया गया है, पहला कार्य संकलन समय त्रुटि उत्पन्न नहीं करेगा। हालांकि, दूसरा होगा क्योंकि संकलक फ़ंक्शन कॉल NoError() के परिणाम का मूल्यांकन नहीं कर सकता है। यह भी मामला है यदि NoError() हमेशा true लौटने के लिए संशोधित किया गया है।

संबंधित मुद्दे