"हाय, अमीगो!"
"अब हमारे पास तार्किक संचालकों पर एक छोटा सा पाठ होगा।"
"आप कौन से तार्किक ऑपरेटरों को जानते हैं?"
- या (||), और (&&), नहीं (!)
"हाँ। अच्छा काम। और क्या आपको याद है कि वे कैसे काम करते हैं?"
"हाँ।"
"या कम से कम एक ऑपरेंड सत्य होने पर सत्य उत्पन्न होता है।"
"और पैदावार सच होती है जब दोनों ऑपरेंड सत्य होते हैं।"
"सत्य को असत्य में और असत्य को सत्य में नहीं बदलता।"
"यह सही है। और इस अभिव्यक्ति में ऑपरेटरों का मूल्यांकन किस क्रम में किया जाता है?"
boolean a = true;
boolean b = false;
boolean c = true;
boolean result = a && b || !c && b || !a;
"यह सब बहुत आसान है।"
"सबसे पहले, नहीं (!), फिर AND (&&), और फिर OR (||) बहुत अंत में।"
यदि हम कोष्ठक जोड़ते हैं, तो हम प्राप्त करेंगे:
boolean a = true;
boolean b = false;
boolean c = true;
boolean result = (a && b) || ((!c) && b) || (!a);
"यह सब सही है, शाबाश। और परिणाम क्या है?"
- 1) (ए && बी) == (सत्य और& असत्य) == असत्य
2) ((!सी) && बी) == (झूठी और& झूठी) == झूठी
3) (!ए) == असत्य
4) असत्य || झूठा || झूठा == झूठा
"नतीजा गलत है।"
"ऐसा लगता है कि आप विषय को पूरी तरह से जानते हैं। फिर मैं आपको कुछ छोटे रहस्य बताऊंगा।"
"सबसे पहले, तार्किक अभिव्यक्तियों का मूल्यांकन बाएं से दाएं की ओर किया जाता है।"
"दूसरा, शॉर्ट-सर्किट मूल्यांकन यहां उपयोग किया जाता है (गणना केवल तभी की जाती है जब आवश्यक हो)। यदि अंतिम परिणाम अभिव्यक्ति के भाग के मूल्यांकन से पहले से ही ज्ञात है, तो शेष अभिव्यक्ति का मूल्यांकन नहीं किया जाता है।"
boolean result = (true && false) || (true && true) || (true && false);
"यह अभिव्यक्ति OR (||) ऑपरेटर द्वारा अलग किए गए तीन भागों में विभाजित है।"
"यदि कम से कम एक भाग सत्य है, तो उत्तर सत्य है और किसी और पर विचार करने की आवश्यकता नहीं है। तदनुसार, अभिव्यक्ति का मूल्यांकन इस प्रकार किया जाता है:"
1) पहले भाग का मूल्यांकन करें: (true && false) == false
2) दूसरे भाग का मूल्यांकन करें: (true && true) == true
3) हम तीसरे भाग का मूल्यांकन नहीं करते हैं, क्योंकि यह पहले से ही स्पष्ट है कि उत्तर सत्य होगा ।
"इस दृष्टिकोण को आलसी मूल्यांकन भी कहा जाता है।"
"ठीक है। और इसमें ऐसा क्या खास है?"
"कुछ नहीं—जब तक आप एक्सप्रेशन के अंदर मेथड्स को कॉल करना शुरू नहीं करते हैं। अगर एक्सप्रेशन का हिस्सा छोड़ दिया जाता है, तो स्किप किए गए हिस्से में मेथड्स को कॉल नहीं किया जाएगा।"
"लेकिन यह दृष्टिकोण बहुत आम हो गया है। यहाँ क्यों है:"
Job job = null;
if (job != null && job.isDone())
{
…
}
"जब अभिव्यक्ति का मूल्यांकन किया जाता है तो नौकरी शून्य होती है, तो job.isDone() कॉल नहीं होगा!"
"वास्तव में, अभिव्यक्ति का पहला भाग गलत है, जिसके बाद AND (&&) आता है। इसलिए, संपूर्ण अभिव्यक्ति को गलत माना जाएगा, और दूसरा भाग आवश्यक नहीं होगा।"
"बिल्कुल सही। यह एक अच्छी तकनीक है, है ना?"
"हां।"
GO TO FULL VERSION