2013-01-15 29 views
6

if-statement&& operator के साथ दूसरे पैरामीटर की जांच करें यदि पहला वाला false/NO है?एंड-कथन के साथ ऑपरेटर दूसरे मूल्य के लिए चेक करता है?

क्या निम्न क्रैश करने में सक्षम होंगे?

NSDictionary *someRemoteData = [rawJson valueForKey:@"data"]; 
if([someRemoteData isKindOfClass:[NSDictionary class]] && someRemoteData.count > 0){ 
    //..do something 
} 

कृपया कोई आसान हाँ या कोई जवाब नहीं है, लेकिन क्यों समझाओ।

+0

यदि उद्देश्य-सी इस संबंध में लगभग सभी अन्य भाषाओं की तरह है, तो जवाब '&&' शॉर्टकट के बाद से नहीं होगा। इसी प्रकार, '||' मूल्यांकन को रोक देगा जब उसे ऐसी स्थिति मिलती है जो सत्य है। – fge

उत्तर

18

नहीं, यह सीखने के बाद अभिव्यक्ति का मूल्यांकन नहीं करता है कि उत्तर NO होगा। इसे शॉर्ट-सर्किटिंग कहा जाता है, और यह सी, सी ++, उद्देश्य सी, और समान वाक्यविन्यास वाली अन्य भाषाओं में बुलियन अभिव्यक्तियों का मूल्यांकन करने का एक अनिवार्य हिस्सा है। मूल्यांकन योजना अनुमानित करने के लिए, शर्तों को बाएं से दाएं मूल्यांकन किया जाता है।

एक ही नियम || ऑपरेटर पर लागू होता है: जैसे ही कोड जानता है कि मान YES है, मूल्यांकन बंद हो जाता है।

शॉर्ट सर्किटिंग आपको if कथन का चयन करने के बजाय, एक समग्र अभिव्यक्ति में अमान्य मूल्यांकन के खिलाफ सुरक्षा करने देता है। उदाहरण के लिए,

if (index >= 0 && index < Length && array[index] == 42) 

परिणामस्वरूप अपरिभाषित व्यवहार होगा यदि यह शॉर्ट सर्किटिंग के लिए नहीं था। लेकिन चूंकि मूल्यांकन array[index] का मूल्यांकन छोड़ देता है जब index अमान्य है, उपर्युक्त अभिव्यक्ति कानूनी है।

+0

उल्लेख नहीं है कि परिस्थितियों का उनके प्रदर्शन के क्रम में मूल्यांकन किया जाता है;) जावा में विचित्र व्यवहार है & 'जो _does_ शॉर्टकट भी नहीं है। – fge

+0

@fge मूल्यांकन आदेश के बारे में नोट के लिए धन्यवाद, यह इस चर्चा के संदर्भ में बहुत महत्वपूर्ण है। – dasblinkenlight

+0

स्पष्टीकरण के लिए धन्यवाद। मैंने पहले ही यह माना है कि यह वास्तव में जानना चाहता था कि क्यों। –

0

नहीं, ऐसा नहीं है। यदि पहला कथन विफल रहता है तो दूसरा कभी चेक नहीं किया जाता है, उदाहरण के लिए आप यह (ArrayList != null && ArrayList.size() > 0) कर सकते हैं और यदि चर प्रारंभ नहीं किया गया है तो आपको कभी भी कोई त्रुटि नहीं मिलेगी।

3

उद्देश्य-सी lazy evaluation का उपयोग करता है, जिसका अर्थ है कि केवल आपके बाएं ऑपरेंड का मूल्यांकन आपके मामले में किया जाता है।