2016-03-08 9 views
7

वास्तविक जावा कोड है:क्यों तार्किक ऑपरेटरों वापस लौटने जावा जबकि संकलन

((rrd == null || !rrd) 
    && null != dam 
    && null != dam.getac() 
    && null != dam.getac().getc() 
    && null != sname 
    && sname.equalsIgnoreCase(dam.getac().getc())) 

लेकिन जब मैं क्लास फाइल पर गौर यह है:

((rrd != null) && (rrd.booleanValue())) 
    || ((((null == dam) 
    || (null == dam.getac()) 
    || (null == dam.getac().getc()) 
    || (null == sname) 
    || (!(sname.equalsIgnoreCase(dam.getac().getc())))))) 

सभी || और && अदला-बदली।

क्या कोई बता सकता है क्यों?

+2

क्या आप निम्नलिखित प्रश्नों को निम्नलिखित में जोड़ सकते हैं: 1) आरआरडी, बांध, स्नैम के कम से कम अनुमानित प्रकार; 2) जावप आउटपुट, आपके रिवर्स-रिवर्स इंजीनियर संस्करण नहीं। धन्यवाद। – Koshinae

+1

क्योंकि या संचालन को संक्षिप्त-सर्किट किया जा सकता है। पहला या यह सच है कि पूरे लॉजिकल ऑपरेशन को सच बनाता है। साथ ही, आपको ** कभी भी ऐसे जटिल तार्किक वक्तव्य नहीं लिखना चाहिए। इंसानों को समझने के लिए वे बहुत ही चुस्त हैं। –

+0

हाय कोशिना, 'आरआरडी', 'बांध' और 'स्नैम' का प्रकार क्रमशः 'बूलियन', 'जावा इकाई' और 'स्ट्रिंग' है। –

उत्तर

-1

देखें: De Morgans Laws

एक || ! बी ==! (ए & & बी)

+4

मुझे लगता है कि ओपी जानता है कि '! ए || बी ==! (ए एंड बी बी) '। हालांकि सवाल यह है कि ** क्यों ** कंपाइलर इसे बदलता है। –

+1

आम तौर पर संकलक प्रदर्शन को अनुकूलित करने के लिए ऐसी चीजें करता है, क्योंकि कुछ संचालन दूसरों की तुलना में तेज़ी से निष्पादित किया जा सकता है। – Christian

+0

मैं उम्मीद नहीं करूँगा कि यह अनुकूलन हो - मुझे उम्मीद है कि ओपी का उपयोग करने वाला डीकंपलर अंतर नहीं बता सकता है, या यह वैसे भी उसी बाइटकोड में संकलित हो सकता है। –

2

अभिव्यक्ति समकक्ष लेकिन उलटा नहीं है। ऐसा लगता है कि संकलक यहां बाहरी (या निहित) से बचाता है।

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

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