2010-05-19 7 views
12

मैं सोच रहा था कि क्या होता है जब कोई प्रोग्राम कई स्थितियों के साथ एक संरचना को संसाधित करता है। मेरे पास एक विचार है, लेकिन मुझे इसके बारे में निश्चित नहीं है। मैं एक उदाहरण दूंगा:क्या होता है यदि if-struct का पहला भाग गलत है?

List<string> myTestList = null; 
if (myTestList != null && myTestList.Count > 0) 
{ 
    //process 
} 

सूची शून्य है। अगर कथन को संसाधित करते समय, क्या यह एक शर्त गलत होने पर बाएं से दाएं से बाहर निकल जाएगी?

मैंने कोशिश की है और कोई त्रुटि नहीं फेंकती है, इसलिए मुझे लगता है कि उपर्युक्त इसे समझाता है, लेकिन मुझे यकीन नहीं है।

+0

जब आप एक 'else' खंड कहा, क्या आप ऐसा देखा? –

+0

इसे बुलाया जाता है, यही कारण है कि मैंने सोचा कि जैसे ही स्थिति एक शर्त के रूप में टूट जाती है – Terry

+0

"टूट जाती है"? "ब्रेक डाउन" से आपका क्या मतलब है? ब्रेक डाउन के साथ –

उत्तर

23

यह && है जो महत्वपूर्ण है। यह शॉर्ट सर्किटिंग है, इसलिए Count का मूल्यांकन कभी नहीं किया जाता है; शर्तों का मूल्यांकन बाएं से दाएं किया जाता है।

एक गैर-शॉर्ट सर्किटिंग ऑपरेटर (&) भी है, लेकिन यह बहुत किसी परीक्षण में देखने के लिए दुर्लभ है; यह मुख्य रूप से बिटवाई ऑपरेशंस के लिए है (int आदि पर)।

कल्पना से:

सशर्त तार्किक ऑपरेटरों

&& और || ऑपरेटरों सशर्त तार्किक ऑपरेटर कहा जाता है। उन्हें "लघु-सर्किटिंग" लॉजिकल ऑपरेटरों भी कहा जाता है। ,

  • आपरेशन x && y आपरेशन x & y से मेल खाती है, सिवाय इसके कि y केवल तभी मूल्यांकन किया जाता है:

    ...

    && और || ऑपरेटरों & और | ऑपरेटरों की सशर्त संस्करण हैं xfalse नहीं है।

  • आपरेशन x || y आपरेशन x | y से मेल खाती है, कि y को छोड़कर का मूल्यांकन केवल तभी xtrue नहीं है।
2

सी # और सबसे अधिक भाषाओं में, && और || हैं शॉर्ट सर्किट, यानी अगर अभिव्यक्ति के पहले भाग परिणाम निर्धारित करने के लिए पर्याप्त है, दूसरे भाग गारंटी निष्पादित करने के लिए नहीं है ।

आपके द्वारा उपयोग किया जाने वाला कोड idiomatic C# कोड है।

2

यदि संदर्भ null है तो मूल्यांकन तत्काल बंद हो जाएगा। इसे तार्किक अभिव्यक्ति शॉर्ट-सर्किट मूल्यांकन कहा जाता है - यदि && का बायां हिस्सा false है, तो दाएं का मूल्यांकन नहीं किया जाता है।

2

यह संक्षिप्त सर्किट है।

a && b 

अगर a गलत है, b का मूल्यांकन नहीं किया जाएगा। हम इस व्यवहार का उपयोग कर सकते हैं क्योंकि अभिव्यक्ति हमेशा झूठी होगी।

इसी तरह,

a || b 

अगर a सच है, b का मूल्यांकन नहीं किया जाएगा।

6

अधिकांश (लेकिन सभी नहीं) आधुनिक भाषाओं में, "short circuit boolean evaluation" नामक एक सुविधा है। इसका मतलब है कि यदि && स्थिति का पहला भाग गलत है, तो दूसरे भाग का मूल्यांकन नहीं किया जाता है।

इसी तरह की सुविधा || पर लागू होती है, जहां पहला भाग सत्य है, तो दूसरे भाग का मूल्यांकन नहीं किया जाता है।

ध्यान दें कि यह सुविधा if कथन तक सीमित नहीं है। निम्नलिखित भी वैध है और संदर्भ के लिए Count अगर myTestList है null कोशिश नहीं करेगा:

bool b = myTestList != null && myTestList.Count > 0; 
1

हाँ, शॉर्ट सर्किट मूल्यांकन किया जाना चाहिए। मैं स्वयं एक सी # डेवलपर नहीं हूं, लेकिन मैंने इसे this Wikipedia article से पढ़ा है।

2

सी # समेत अधिकांश आधुनिक प्रोग्रामिंग भाषाएं, जिसे मैककार्थी के अनुक्रमिक संयोजन ऑपरेटर के रूप में जाना जाता है, लागू करें। इसका मतलब यह है:

a && b <=> a ? b : false 

आप इन दो बराबर भाव के दूसरे को देखें, तो यह काफी स्पष्ट b मूल्यांकन किया जाता है कि यदि और केवल यदि a सच है हो जाता है।और इसके विपरीत:

a || b <=> a ? true : b 
0

निम्नलिखित नमूना कार्यक्रम के लिए:

शून्य परीक्षण() { bool f1 = 0; बूल एफ 2 = 0;

अगर (F2 & & (f1 = 1)) {अदालत < < "इनसाइड 1" < < endl; } अदालत < < "F1" < < f1 < < ": एफ 2:" < < f2 < < endl;

अगर ((f1 = 1) & & F2) {अदालत < < "इनसाइड 2" < < endl; } अदालत < < "F1" < < f1 < < ": एफ 2:" < < f2 < < endl; }

आउटपुट होगा: एफ 1 0: एफ 2: 0

एफ 1 1: एफ 2: 0

कौन सा मूल रूप से पता चलता है कि बाएं से दाएं अगर पाश निष्पादित किया जा रहा है। 1. लूप में पहली बार, पहली स्थिति विफल हो जाती है और यह दूसरे भाग की जांच करने के लिए परेशान नहीं होती है। 2. लूप में दूसरे में, पहला भाग पहले और फिर दूसरा भाग चलाया जाता है।

यह सी ++ के लिए काम करेगा। उम्मीद है की यह मदद करेगा।

  • इवर
संबंधित मुद्दे