अन्य उत्तरों ने ऑपरेटरों के बीच कार्यात्मक अंतर को कवर करने का अच्छा काम किया है, लेकिन उत्तर आज अस्तित्व में हर एक सी-व्युत्पन्न भाषा के बारे में लागू हो सकते हैं। प्रश्न के साथ टैग किया गया हैजावा, और इसलिए मैं जावा भाषा के लिए विशेष रूप से और तकनीकी रूप से जवाब देने का प्रयास करूंगा।
&और |या तो इंटेगर बिटवाइज ऑपरेटर्स, या बूलियन लॉजिकल ऑपरेटर्स हो सकते हैं। बिटवाइज़ और लॉजिकल ऑपरेटर्स के लिए वाक्य रचना ( 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 ) के अधीन है । परिणामी मूल्य सशर्त-या अभिव्यक्ति का मूल्य बन जाता है।
- इस प्रकार, पर या ऑपरेंड
||के समान परिणाम की गणना करता है। यह केवल इस बात में भिन्न है कि दाएं हाथ की ऑपरेंड अभिव्यक्ति का मूल्यांकन हमेशा के बजाय सशर्त रूप से किया जाता है।|booleanBoolean
संक्षेप में, @JohnMeagher ने बार-बार टिप्पणियों में बताया है, &और |वास्तव में, ऑपरेंड के विशिष्ट मामले में गैर-शॉर्ट-सर्कुलेटिंग बूलियन ऑपरेटर हैं booleanया Boolean। अच्छी प्रथाओं के साथ (यानी: कोई माध्यमिक प्रभाव नहीं), यह एक मामूली अंतर है। जब ऑपरेंड्स booleanएस या Booleanएस नहीं होते हैं , हालांकि, ऑपरेटर बहुत अलग तरीके से व्यवहार करते हैं : बिटवाइज़ और लॉजिकल ऑपरेशंस बस जावा प्रोग्रामिंग के उच्च स्तर पर अच्छी तरह से तुलना नहीं करते हैं।