2012-04-15 22 views
11

दोनों सशर्त ऑपरेटरों & & और ||
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html के अनुसार संक्षिप्त सर्किट हैं, जिसका अर्थ है कि दूसरे ऑपरेंड को कभी-कभी मूल्यांकन करने की आवश्यकता नहीं होती है।सशर्त या ऑपरेटर (||)

क्या कोई ऐसा उदाहरण प्रदान कर सकता है जिसमें सशर्त-OR (||) ऑपरेटर को संक्षिप्त सर्किट किया जाएगा?

लघु सर्किटिंग व्यवहार में के रूप में सशर्त-और (& &) ऑपरेटर के साथ बिल्कुल स्पष्ट है:

अगर (गलत & & (1> 0)) तो दूसरी संकार्य: (1> 0) मूल्यांकन करने की आवश्यकता नहीं होगी लेकिन सशर्त-या के लिए एक उदाहरण खोजने/सोचने के लिए प्रतीत नहीं होता है।

+1

लघु सर्किटिंग तब होगी जब पहली ऑपरेंड के परिणाम तार्किक संचालन के परिणाम को परिभाषित कर सकते हैं। '&& 'पहले' झूठी 'बनने के लिए परिणाम' झूठा 'निश्चित रूप से होगा और' || 'के लिए पहला बनने से परिणाम' सत्य 'निश्चित रूप से होगा। तो पहले ऑपरेंड 'सत्य' होने के कारण हमेशा '||' ऑपरेटर के लिए शॉर्ट सर्किट होगा। –

+1

यह कम सीधा क्यों है || यह बिल्कुल सरल है जैसे &&। अभिव्यक्तियों की गणना रोक दी जाती है जब पूरी स्थिति का मूल्य ज्ञात होता है। अभिव्यक्तियों का मूल्यांकन बाएं से दाएं से किया जाता है। –

+0

@ माइकलस्चमेइसर: क्षमा करें, मुझे नहीं पता कि मैं इसे सीधा होने से कैसे चूक गया। – Vivek

उत्तर

1
if(true || (0 > 1)) 

पहला कथन सत्य है, और इसलिए दूसरे का मूल्यांकन करना आवश्यक नहीं है।

15

या ऑपरेटर छोटा-सर्किट होता है जब पहला ऑपरेंड सत्य होता है। तो,

String foo = null; 
if (true || foo.equals("")) { 
    // ... 
} 

NullPointerException फेंक नहीं देता है।

जैसा कि @prajeesh सही टिप्पणियों में इंगित करता है, जिस तरह से वास्तविक कोड में शॉर्ट सर्किटिंग का उपयोग NullPointerException को रोकने के लिए होता है जब भी आप एक एपीआई से निपट रहे हैं जो शून्य हो सकता है। तो, उदाहरण के लिए, अगर वहाँ एक readStringFromConsole विधि है कि या तो वर्तमान में उपलब्ध स्ट्रिंग या अशक्त रिटर्न उपयोगकर्ता कुछ भी लिखने नहीं करता है, हम

String username = readStringFromConsole(); 
while (username == null || username.length() == 0) { 
    // No NullPointerException on the while clause because the length() call 
    // will only be made if username is not null 

    System.out.println("Please enter a non-blank name"); 
    username = readStringFromConsole(); 
} 

// Now do something useful with username, which is non-null and of nonzero length 

एक तरफ ध्यान दें के रूप में, एक API कि उपयोगकर्ता इनपुट रिटर्न लिख सकता है जब भी उपयोगकर्ता कुछ भी टाइप नहीं करता है तो रिक्त स्ट्रिंग वापस करनी चाहिए, और शून्य वापस नहीं आना चाहिए। रिटर्निंग नल यह कहने का एक तरीका है कि "कुछ भी उपलब्ध नहीं है," खाली स्ट्रिंग लौटने पर "उपयोगकर्ता ने कुछ भी टाइप नहीं किया" कहने का एक तरीका है और इसलिए इसे प्राथमिकता दी जाती है।

+1

मुझे ऐसी स्थिति नहीं मिली जहां यह विशिष्ट 'सत्य || है foo.equals ("") 'चीजों को समझदारी से तार्किक रूप से दिखता है, यह होना चाहिए' अगर (foo == null || foo.equals ("")) 'जो' foo' शून्य होने पर छोटा सर्किट होगा और इस प्रकार एनपीई को रोक देगा । –

1
if (true || comparison) 

तुलना का मूल्यांकन कभी नहीं किया जाएगा, क्योंकि इसका परिणाम अप्रासंगिक है (क्योंकि पहला तर्क पहले से ही सत्य है)।

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