अन्य उत्तरों ने ऑपरेटरों के बीच कार्यात्मक अंतर को कवर करने का अच्छा काम किया है, लेकिन उत्तर आज अस्तित्व में हर एक सी-व्युत्पन्न भाषा के बारे में लागू हो सकते हैं। प्रश्न के साथ टैग किया गया हैजावा, और इसलिए मैं जावा भाषा के लिए विशेष रूप से और तकनीकी रूप से जवाब देने का प्रयास करूंगा।
&
और |
या तो इंटेगर बिटवाइज ऑपरेटर्स, या बूलियन लॉजिकल ऑपरेटर्स हो सकते हैं। बिटवाइज़ और लॉजिकल ऑपरेटर्स के लिए वाक्य रचना ( 215.22 ) है:
AndExpression:
EqualityExpression
AndExpression & EqualityExpression
ExclusiveOrExpression:
AndExpression
ExclusiveOrExpression ^ AndExpression
InclusiveOrExpression:
ExclusiveOrExpression
InclusiveOrExpression | ExclusiveOrExpression
वाक्य रचना के लिए EqualityExpression
में परिभाषित किया गया है §15.21 , जो आवश्यकता RelationalExpression
के रूप में परिभाषित §15.20 , जो बारी में की आवश्यकता है ShiftExpression
और ReferenceType
में परिभाषित §15.19 और §4.3 , क्रमशः। ShiftExpression
में AdditiveExpression
परिभाषित किया गया हैdefined15.18 , जो कि मूल अंकगणित, एकरी संचालकों आदि को परिभाषित करते हुए ड्रिल करने के लिए जारी रहती है, जो ReferenceType
एक प्रकार का प्रतिनिधित्व करने के लिए सभी विभिन्न तरीकों से नीचे जाती है। (जबकि ReferenceType
आदिम प्रकार शामिल नहीं है, आदिम प्रकार की परिभाषा अंततः, के लिए आवश्यक है के रूप में वे एक सरणी है, जिसके लिए आयाम प्रकार हो सकता है है एक ReferenceType
।)
बिटवाइज़ और लॉजिकल ऑपरेटर्स के निम्नलिखित गुण हैं:
- इन ऑपरेटरों की अलग-अलग मिसालें हैं, जिनमें
&
सबसे ज्यादा मिसाल और |
सबसे कम मिसाल है।
- इनमें से प्रत्येक ऑपरेटर वाक्यात्मक रूप से बाएं-सहयोगी (प्रत्येक समूह बाएं से दाएं) है।
- यदि प्रत्येक ऑपरेटर के कोई साइड इफेक्ट नहीं हैं, तो प्रत्येक ऑपरेटर सराहनीय है।
- प्रत्येक ऑपरेटर सहयोगी है।
- बिटवाइज़ और लॉजिकल ऑपरेटर्स का उपयोग संख्यात्मक प्रकार के दो ऑपरेंड्स या टाइप के दो ऑपरेंड्स की तुलना करने के लिए किया जा सकता है
boolean
। अन्य सभी मामलों में एक संकलन-समय त्रुटि होती है।
चाहे ऑपरेटर एक बिटवाइज़ ऑपरेटर या एक तार्किक ऑपरेटर के रूप में कार्य करता है के बीच भेद ऑपरेंड ( "एक आदिम अभिन्न प्रकार के लिए परिवर्तनीय" कर रहे हैं पर निर्भर करता §4.2 ) या वे प्रकार के होते हैं, तो boolean
या Boolean
( §5.1.8 ) के हैं।
यदि ऑपरेंड अभिन्न प्रकार के होते हैं, तो दोनों ऑपरेंड पर बाइनरी न्यूमेरिक प्रमोशन ( ands5.6.2 ) किया जाता है, इन दोनों को ऑपरेशन के लिए long
या तो छोड़ दिया जाता है int
। ऑपरेशन का प्रकार (पदोन्नत) ऑपरेंड्स का प्रकार होगा। उस बिंदु पर, &
बिटवाइज़ और, ^
बिटवाइज़ एक्सक्लूसिव OR |
होगा , और बिटवाइज़ इंक्लूसिव OR होगा। ( 215.22.1 )
यदि ऑपरेंड हैं boolean
या Boolean
, यदि आवश्यक हो ( .15.1.8 ), तो ऑपरेंड अनबॉक्सिंग रूपांतरण के अधीन होगा और ऑपरेशन का प्रकार होगा boolean
। &
परिणाम देगा में true
दोनों ऑपरेंड कर रहे हैं true
, ^
में परिणाम होगा true
अगर दोनों ऑपरेंड अलग हैं, और |
में परिणाम होगा true
यदि या तो संकार्य है true
। ( 215.22.2) )
इसके विपरीत, &&
" कंडिशनल -एंड ऑपरेटर" ( 315.23 ) है और " कंडिशनल||
-ऑर ऑपरेटर" (" 15.24 ) है। उनके सिंटैक्स को इस प्रकार परिभाषित किया गया है:
ConditionalAndExpression:
InclusiveOrExpression
ConditionalAndExpression && InclusiveOrExpression
ConditionalOrExpression:
ConditionalAndExpression
ConditionalOrExpression || ConditionalAndExpression
&&
यह पसंद है &
, सिवाय इसके कि यह केवल सही ऑपरेंड का मूल्यांकन करता है यदि बाएं ऑपरेंड है true
। ||
यह पसंद है |
, सिवाय इसके कि यह केवल सही ऑपरेंड का मूल्यांकन करता है यदि बाएं ऑपरेंड हैfalse
।
सशर्त और निम्नलिखित गुण हैं:
- सशर्त-ऑपरेटर और ऑपरेटर वाक्यात्मक रूप से बाएं-साहचर्य है (यह समूह बाएं से दाएं)।
- सशर्त-और ऑपरेटर साइड इफेक्ट और परिणाम मूल्य दोनों के संबंध में पूरी तरह से सहयोगी है। यही कारण है कि, किसी भी भाव के लिए किया जाता है
a
, b
और c
, अभिव्यक्ति के मूल्यांकन ((a) && (b)) && (c)
एक ही परिणाम, उत्पादन उसी क्रम में होने वाली एक ही साइड इफेक्ट के साथ अभिव्यक्ति के मूल्यांकन के रूप में(a) && ((b) && (c))
।
- सशर्त-और ऑपरेटर के प्रत्येक प्रकार के प्रकार
boolean
या होने चाहिएBoolean
, या एक संकलन-समय त्रुटि होती है।
- एक सशर्त और अभिव्यक्ति का प्रकार हमेशा होता है
boolean
।
- रन समय में, बाएं हाथ की ऑपरेंड अभिव्यक्ति का मूल्यांकन पहले किया जाता है; यदि परिणाम में टाइप है
Boolean
, तो यह अनबॉक्सिंग रूपांतरण ( .85.1.8 ) के अधीन है ।
- यदि परिणामी मूल्य है
false
, तो सशर्त-और अभिव्यक्ति का मूल्य है false
और दाहिने हाथ की ऑपरेंड अभिव्यक्ति का मूल्यांकन नहीं किया गया है।
- यदि बाएं हाथ के संचालन का मूल्य है
true
, तो दाहिने हाथ की अभिव्यक्ति का मूल्यांकन किया जाता है; यदि परिणाम में टाइप है Boolean
, तो यह अनबॉक्सिंग रूपांतरण ( .85.1.8 ) के अधीन है । परिणामी मूल्य सशर्त-और अभिव्यक्ति का मूल्य बन जाता है।
- इस प्रकार,
&&
के रूप में एक ही परिणाम की गणना &
पर boolean
ऑपरेंड। यह केवल इस बात में भिन्न है कि दाएं हाथ की ऑपरेंड अभिव्यक्ति का मूल्यांकन हमेशा के बजाय सशर्त रूप से किया जाता है।
सशर्त-या में निम्नलिखित गुण हैं:
- सशर्त-या ऑपरेटर वाक्यात्मक रूप से बाएं-साहचर्य है (यह समूह बाएं से दाएं)।
- सशर्त या ऑपरेटर पूरी तरह से साइड इफेक्ट और परिणाम मूल्य दोनों के संबंध में सहयोगी है। यह है कि, किसी भी भाव के लिए
a
, b
है, और c
, अभिव्यक्ति के मूल्यांकन ((a) || (b)) || (c)
एक ही परिणाम, एक ही साइड इफेक्ट, उसी क्रम में होने वाली अभिव्यक्ति के मूल्यांकन के रूप में के साथ पैदा करता है (a) || ((b) || (c))
।
- सशर्त-या ऑपरेटर का प्रत्येक संचालक प्रकार का होना चाहिए
boolean
या Boolean
, या संकलन-समय त्रुटि उत्पन्न हो सकती है।
- सशर्त-या अभिव्यक्ति का प्रकार हमेशा होता है
boolean
।
- रन समय में, बाएं हाथ की ऑपरेंड अभिव्यक्ति का मूल्यांकन पहले किया जाता है; यदि परिणाम में टाइप है
Boolean
, तो यह अनबॉक्सिंग रूपांतरण ( .85.1.8 ) के अधीन है ।
- यदि परिणामी मूल्य है
true
, तो सशर्त-या अभिव्यक्ति का मूल्य है true
और दाहिने हाथ की ऑपरेंड अभिव्यक्ति का मूल्यांकन नहीं किया गया है।
- यदि बाएं हाथ के संचालन का मूल्य है
false
, तो दाहिने हाथ की अभिव्यक्ति का मूल्यांकन किया जाता है; यदि परिणाम में टाइप है Boolean
, तो यह अनबॉक्सिंग रूपांतरण ( .85.1.8 ) के अधीन है । परिणामी मूल्य सशर्त-या अभिव्यक्ति का मूल्य बन जाता है।
- इस प्रकार, पर या ऑपरेंड
||
के समान परिणाम की गणना करता है। यह केवल इस बात में भिन्न है कि दाएं हाथ की ऑपरेंड अभिव्यक्ति का मूल्यांकन हमेशा के बजाय सशर्त रूप से किया जाता है।|
boolean
Boolean
संक्षेप में, @JohnMeagher ने बार-बार टिप्पणियों में बताया है, &
और |
वास्तव में, ऑपरेंड के विशिष्ट मामले में गैर-शॉर्ट-सर्कुलेटिंग बूलियन ऑपरेटर हैं boolean
या Boolean
। अच्छी प्रथाओं के साथ (यानी: कोई माध्यमिक प्रभाव नहीं), यह एक मामूली अंतर है। जब ऑपरेंड्स boolean
एस या Boolean
एस नहीं होते हैं , हालांकि, ऑपरेटर बहुत अलग तरीके से व्यवहार करते हैं : बिटवाइज़ और लॉजिकल ऑपरेशंस बस जावा प्रोग्रामिंग के उच्च स्तर पर अच्छी तरह से तुलना नहीं करते हैं।