2012-02-18 18 views
11

संभव डुप्लिकेट:
Does java evaluate remaining conditions after boolean result is known
Why do we usually use || not |, what is the difference?लघु सर्किटिंग क्या है और जावा में प्रोग्रामिंग करते समय इसका उपयोग कैसे किया जाता है?

मैं दूसरे दिन मेरी कक्षा व्याख्यान याद किया और अगर कोई और हो सकता है की एक उदाहरण के एक विवरण क्या कम सर्किटिंग है दे सकता है मैं सोच रहा था इसका उपयोग एक साधारण जावा प्रोग्राम में किया जा रहा है। आपकी सहायताके लिए धन्यवाद!

+3

http://en.wikipedia.org/wiki/Short-circuit_evaluation – Matt

उत्तर

26

लघु-सर्किटिंग वह जगह है जहां इसके परिणाम निर्धारित होने पर एक अभिव्यक्ति का मूल्यांकन बंद कर दिया जाता है। उदाहरण के लिए तो:

if (a == b || c == d || e == f) { 
    // Do something 
} 

तो a == b सच क्योंकि अभिव्यक्ति के परिणाम पहले से ही निर्धारित किया गया है c == d और e == fसभी में कभी नहीं का मूल्यांकन कर रहे हैं तो,,। यदि a == b गलत है, तो c == d का मूल्यांकन किया गया है; यदि यह सत्य है, तो e == f का मूल्यांकन कभी नहीं किया जाता है। तो

if (foo() || bar() || baz()) { 
    // Do something 
} 

foo() तो रिटर्न सच है, bar और baz कहा जाता है कभी नहीं कर रहे हैं, क्योंकि अभिव्यक्ति के परिणाम पहले से ही निर्धारित किया गया है: यह कोई फर्क लग सकता है, लेकिन पर विचार करें। तो यदि bar या baz कुछ कुछ लौटने से कुछ अन्य प्रभाव पड़ता है (साइड इफेक्ट), तो ये प्रभाव कभी नहीं होते हैं।

एक शॉर्ट सर्किट के महान उदाहरण संदर्भ वस्तु से संबंधित है:

if (a != null && a.getFoo() != 42) { 
    // Do something 
} 

a.getFoo() सामान्य रूप से फेंक एक NullPointerException अगर a थे null, लेकिन क्योंकि अभिव्यक्ति शॉर्ट सर्किट, अगर a != nullfalse, a.getFoo() हिस्सा है कभी नहीं होता, इसलिए हमें अपवाद नहीं मिलता है।

ध्यान दें कि सभी अभिव्यक्तियां संक्षिप्त-सर्किट नहीं हैं। || और && ऑपरेटर शॉर्ट सर्किट हैं, लेकिन | और & नहीं हैं, न ही * या / हैं; वास्तव में ज्यादातर ऑपरेटरों नहीं हैं।

उदा |

2

Short Circuit: यदि पहला भाग true शेष अभिव्यक्ति का मूल्यांकन करने से परेशान नहीं है। && के मामले में false के लिए समान तर्क लागू होता है जो

+0

अधिक सटीक: परिणामस्वरूप निश्चित रूप से एक तार्किक अभिव्यक्ति का मूल्यांकन करना बंद करें। – biziclop

+1

आपने अभी कहा है कि जावा केवल अभिव्यक्ति के पहले भाग का मूल्यांकन करता है। – Jeffrey

+0

डाउनवोट क्यों? – Cratylus

0

अभिव्यक्ति के मूल्यांकन को कम सर्किट करने का अर्थ है कि अभिव्यक्ति का केवल एक हिस्सा इसका मूल्य खोजने से पहले मूल्यांकन करने की आवश्यकता है। उदाहरण के लिए:

a == null || a.size() == 0 

तो anull है, a.size() == 0 उपसूचक, मूल्यांकन नहीं किया जाएगा क्योंकि बूलियन ऑपरेटर ||true का मूल्यांकन करता है, तो इसकी ऑपरेंड में से एक true है।

इसी तरह, इस अभिव्यक्ति के लिए:

a != null && a.size() > 0 

तो anull है, तो a.size() > 0, मूल्यांकन नहीं किया जाएगा क्योंकि बूलियन ऑपरेटर &&false का मूल्यांकन करता है, तो इसकी ऑपरेंड में से एक false है।

उपरोक्त उदाहरण बूलियन ऑपरेटरों && और || शॉर्ट सर्किट होने के लिए कहा जाता है, तथ्य यह है कि दूसरे संकार्य अगर पहले संकार्य के मूल्य में पूरे अभिव्यक्ति के मूल्य निर्धारित करने के लिए पर्याप्त है मूल्यांकन नहीं किया जा सकता है को देखते हुए । तुलना के लिए, & और | ऑपरेंड समकक्ष गैर-शॉर्ट-सर्किट बूलियन ऑपरेटर हैं।

3

Short-circuit evaluation मतलब यह है कि जब बूलियन अभिव्यक्ति (तार्किक AND और OR) का मूल्यांकन आप जैसे ही आप पहली शर्त जो संतुष्ट या अभिव्यक्ति को नकारता लगता है रोक सकता है।

उदाहरण के लिए, आपको कई उप-भाव के साथ एक तार्किक OR का मूल्यांकन किया गया लगता है, जिनमें से प्रत्येक का मूल्यांकन करने के लिए बहुत महंगा है:

if (costlyTest1() || costlyTest2() || costlyTest3()) { // ... 

JVM यह जैसे ही मूल्यांकन करते समय "costlyTest" कार्यों को रोक सकता है वह 0 पाता है जो true देता है, क्योंकि इससे बूलियन अभिव्यक्ति को पूरा किया जाएगा। तो यदि costlyTest1() सत्य लौटाता है तो अन्य परीक्षण छोड़े जाएंगे। इसी तरह:

if (costlyTest1() && costlyTest2() && costlyTest3()) { // ... 

JVM के रूप में यह एक है कि false देता है, के बाद से वह भी अभिव्यक्ति को संतुष्ट करता है पाता है जैसे ही कार्यों का मूल्यांकन करने को रोकने के कर सकते हैं; इसलिए यदि costlyTest1() झूठा लौटाता है तो अन्य कार्यों को नहीं कहा जाएगा।

ये नियम बूलियन अभिव्यक्तियों के घोंसले के किसी भी स्तर से संबंधित हैं और उपरोक्त उदाहरणों में दिखाए गए अनावश्यक काम से बचने के लिए इसका लाभ उठाया जा सकता है।

+0

आह, मैं देखता हूं। वह काफी आसान था। आपके त्वरित और स्पष्ट स्पष्टीकरण के लिए धन्यवाद! –

0

लघु सर्किटिंग तार्किक AND या OR ऑपरेटर्स का उपयोग का एक वैकल्पिक तरीका (& या) है एक गैर शॉर्ट सर्किट या

if(false | true) { 

} 

पहली शर्त और दूसरी शर्त दोनों मूल्यांकन किया जाता है, भले ही गलत है (यह हमेशा होता है) सच नहीं है।

हालांकि यह एक शॉर्ट सर्किट के रूप में लिखा गया था है या:

if(false || true) { 

} 

पहली शर्त ही मूल्यांकन किया जाता है, क्योंकि यह गलत है, सच का मूल्यांकन नहीं किया जाता है, क्योंकि यह आवश्यक नहीं है।

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

  • कोई संबंधित समस्या नहीं^_^