2011-12-20 12 views
5

कहते हैं कि मैं इस राशि की सुविधा देता है एक भी अंदर कई शर्तों के साथ जावा सौदा करता है। क्या जावा को बुल्स 1 और बूल 2 की जांच करने के लिए पर्याप्त स्मार्ट है यदि बूल 1 का गलत मूल्यांकन किया गया था? क्या जावा उन्हें बाएं से दाएं भी देखता है? मैं यह पूछ रहा हूं क्योंकि जब मैं उन्हें करने के लिए लेता हूं (बाएं सस्ता वाले लोगों से शुरू होता है) तब तक मैं अपने अंदर की स्थितियों को "सॉर्टिंग" कर रहा था। अब मुझे यकीन नहीं है कि यह मुझे कोई प्रदर्शन लाभ देता है क्योंकि मुझे नहीं पता कि जावा इसे कैसे संभालता है।कैसे यदि बयान

+0

चूंकि आप इन परिवर्तनों के साथ प्रदर्शन में सुधार करने की कोशिश कर रहे हैं, क्या आपने शर्तों को आगे बढ़ाने से पहले और बाद में प्रदर्शन को मापने की कोशिश की है? एक तरफ, आपको यह बताने चाहिए कि तर्क वास्तव में नीचे वर्णित अनुसार शॉर्ट सर्किट किया जा रहा है, और दूसरी तरफ, यह आपको बताएगा कि बड़ी तस्वीरों में इन परिवर्तनों की परिमाण महत्वपूर्ण है या नहीं। – Douglas

उत्तर

19

पर इस विकिपीडिया पृष्ठ पर एक नज़र डालें हाँ, जावा (अन्य मुख्यधारा भाषाओं के समान) का उपयोग करता है आलसी मूल्यांकन कम सर्किटिंग जो इसे यथासंभव कम मूल्यांकन करता है मतलब है।

इसका मतलब है कि निम्नलिखित कोड पूरी तरह से सुरक्षित है:

if(p != null && p.getAge() > 10) 

इसके अलावा, a || b कभी नहीं का मूल्यांकन करता है b अगर atrue मूल्यांकन करता है।

+2

पुराने धागे को खोदने के लिए खेद है, लेकिन आपके पास "&& और" क्यों है? क्या आपका मतलब सिर्फ "&&" है? –

4

हां, जिसे शॉर्ट-सर्किटिंग कहा जाता है।

कृपया short-circuiting

12

क्या जावा को बुल्स 1 और बूल 2 को छोड़ने के लिए पर्याप्त स्मार्ट है यदि बूल 1 का गलत मूल्यांकन किया गया था?

यह स्मार्ट होने की बात नहीं है, इसकी भाषा में निर्दिष्ट एक आवश्यकता है। अन्यथा आप अभिव्यक्तियाँ लिख नहीं सकते थे।

if(s != null && s.length() > 0) 

या

if(s == null || s.length() == 0) 

BTW आप & और | यह हमेशा अभिव्यक्ति के दोनों पक्षों का मूल्यांकन करेंगे का उपयोग करें।

6

कृपया look up जावा में & और && के बीच का अंतर (समान | और || पर लागू होता है)।

& और |, सिर्फ तार्किक ऑपरेटरों रहे हैं, जबकि && और ||सशर्त तार्किक ऑपरेटरों, जो आपके उदाहरण में इसका मतलब है कि

if(bool1 && bool2 && bool3) { 

bool2 और bool3 अगर bool1 है झूठे, और

छोड़ देगा रहे हैं
if(bool1 & bool2 & bool3) { 

उनके मूल्यों के बावजूद सभी शर्तों का मूल्यांकन करेगा।

उदाहरण के लिए

, यह देखते हुए:

boolean foo() { 
    System.out.println("foo"); 
    return true; 
} 

if(foo() | foo())fooदो बार प्रिंट होगा, और if(foo() || foo()) - बस एक बार

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