क्या जावा और = ऑपरेटर लागू होते हैं और या &&?


139

यह मानते हुए

boolean a = false;

मैं सोच रहा था कि क्या कर रहा हूँ:

a &= b; 

के बराबर है

a = a && b; //logical AND, a is false hence b is not evaluated.

या दूसरी ओर इसका मतलब है

a = a & b; //Bitwise AND. Both a and b are evaluated.

जवाबों:


146

जावा लैंग्वेज स्पेसिफिकेशन से - 15.26.2 कंपाउंड असाइनमेंट ऑपरेटर्स

प्रपत्र E1 op= E2का एक मिश्रित असाइनमेंट अभिव्यक्ति के बराबर है E1 = (T)((E1) op (E2)), जहां Tप्रकार है E1, सिवाय इसके कि E1केवल एक बार मूल्यांकन किया जाता है।

तो a &= b;के बराबर है a = a & b;

(कुछ उपयोगों में, टाइप-कास्टिंग से परिणाम पर फर्क पड़ता है, लेकिन इसमें किसी bको होना चाहिए booleanऔर टाइप-कास्ट कुछ भी नहीं है।)

और, रिकॉर्ड के लिए, a &&= b;वैध जावा नहीं है। कोई &&=ऑपरेटर नहीं है।


व्यवहार में, के बीच थोड़ा अर्थ अंतर नहीं है a = a & b;और a = a && b;। (यदि bएक चर या स्थिर है, तो परिणाम दोनों संस्करणों के लिए समान होने जा रहा है। केवल bएक उप- भेद है जब उप-प्रभाव होता है जिसके दुष्प्रभाव होते हैं। &मामले में, दुष्प्रभाव हमेशा होता है। &&यह मान के आधार पर होता है a।)

प्रदर्शन पक्ष पर, व्यापार-बंद मूल्यांकन की लागत b, और परीक्षण और लागत के मूल्य की शाखा a, और एक अनावश्यक असाइनमेंट से बचने की संभावित बचत के बीच है a। विश्लेषण सीधे-आगे नहीं है, लेकिन जब तक गणना की लागत bगैर-तुच्छ नहीं है, तब तक दो संस्करणों के बीच प्रदर्शन अंतर विचार करने के लिए बहुत छोटा है।


आपका "व्यवहार में" पैराग्राफ भ्रामक है। उपयोग करने के लिए और अधिक && का एकमात्र कारण "b" में गैर तुच्छ
अवशिष्टता की

स्पष्ट किया। (वास्तव में, तुच्छता वास्तव में इसमें नहीं आती है।)
स्टीफन सी

51

देख JLS की 15.22.2 । बूलियन ऑपरेंड के लिए, &ऑपरेटर बूलियन है, बिटवाइज़ नहीं। बूलियन ऑपरेंड्स के बीच &&और इसके &लिए एकमात्र अंतर &&यह है कि इसके लिए कम परिचालित किया जाता है (जिसका अर्थ है कि दूसरे ऑपरेंड का मूल्यांकन नहीं किया जाता है यदि पहला ऑपरेंड गलत का मूल्यांकन करता है)।

तो आपके मामले में, अगर bएक आदिम, है a = a && b, a = a & bऔर a &= bएक ही बात सभी करते हैं।


2
यदि पद्धति विधि है तो इसलिए (a & = b?) शॉर्ट-सर्किट नहीं करेगा? क्या कोई "&& =" ऑपरेटर है?
7

2
ऐसा लगता है कि इस सवाल का जवाब नहीं है; ओपी पहले से ही शॉर्ट-सर्किटिंग के बारे में जानता था।
या मैपर


0

इसका परीक्षण करने का एक सरल तरीका यहां दिया गया है:

public class OperatorTest {     
    public static void main(String[] args) {
        boolean a = false;
        a &= b();
    }

    private static boolean b() {
        System.out.println("b() was called");
        return true;
    }
}

आउटपुट है b() was called, इसलिए दाहिने हाथ के ऑपरेंड का मूल्यांकन किया जाता है।

इसलिए, जैसा कि पहले ही दूसरों ने बताया a &= bहै, वैसा ही है a = a & b


-2

मैं बूलियन्स का उपयोग करके एक समान स्थिति में आया था जहां मैं कॉलिंग से बचने से बचना चाहता था (यदि पहले से ही झूठ था।

यह मेरे लिए काम किया:

a &= a && b()

25
अतिरेक से बचने के लिए (अभी भी छोटी-चक्कर लगाने की अनुमति), आप बस लिख सकते हैं a=a&&b()
उनाई विवि सिप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.