जवाबों:
जावा लैंग्वेज स्पेसिफिकेशन से - 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
गैर-तुच्छ नहीं है, तब तक दो संस्करणों के बीच प्रदर्शन अंतर विचार करने के लिए बहुत छोटा है।
देख JLS की 15.22.2 । बूलियन ऑपरेंड के लिए, &
ऑपरेटर बूलियन है, बिटवाइज़ नहीं। बूलियन ऑपरेंड्स के बीच &&
और इसके &
लिए एकमात्र अंतर &&
यह है कि इसके लिए कम परिचालित किया जाता है (जिसका अर्थ है कि दूसरे ऑपरेंड का मूल्यांकन नहीं किया जाता है यदि पहला ऑपरेंड गलत का मूल्यांकन करता है)।
तो आपके मामले में, अगर b
एक आदिम, है a = a && b
, a = a & b
और a &= b
एक ही बात सभी करते हैं।
यह अंतिम है:
a = a & b;
इसका परीक्षण करने का एक सरल तरीका यहां दिया गया है:
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
।
मैं बूलियन्स का उपयोग करके एक समान स्थिति में आया था जहां मैं कॉलिंग से बचने से बचना चाहता था (यदि पहले से ही झूठ था।
यह मेरे लिए काम किया:
a &= a && b()
a=a&&b()
।