&& और || तार्किक नहीं हैं लेकिन सशर्त संचालक हैं?


62

मैं थोड़ा MSDN सी # प्रलेखन जिसमें कहा गया है कि से उलझन में हूँ &और |तार्किक ऑपरेटर हैं और कहा कि &&और ||सशर्त ऑपरेटर हैं।

मैं कॉल करता रहता हूं &&, ||और !लॉजिकल ऑपरेटर्स, तो मैं गलत हूं?


4
यह अस्वाभाविक लगता है, लेकिन दोनों वर्गों के बीच एक महत्वपूर्ण अंतर है, और यह महत्वपूर्ण है कि आप यह नहीं मानते हैं, कहते हैं, के |साथ विनिमेय है ||, भले ही कई मामलों में उन्हें कार्यक्रम के व्यवहार में कोई स्पष्ट परिवर्तन के साथ बदल दिया जा सकता है।
डैनियल आर हिक्स

जवाबों:


120

मैं थोड़ा MSDN सी # प्रलेखन जिसमें कहा गया है कि से उलझन में हूँ &और |तार्किक ऑपरेटर हैं और कहा कि &&और ||सशर्त ऑपरेटर हैं। मैं कॉल करता रहता हूं &&, ||और !लॉजिकल ऑपरेटर्स, तो मैं गलत हूं?

नहीं; तुम सही हो।

MSDN प्रलेखन में कई छोटे, ज्यादातर महत्वहीन नामकरण त्रुटियां हैं; मैंने उनमें से कई को बाहर निकालने की कोशिश की, जैसे कि मैं कर सकता था, लेकिन ऐसे मामलों में जहां यह गलत और भ्रामक नहीं है, यह हमेशा समय का एक बुद्धिमान उपयोग नहीं है। यदि आप C # सुविधा के नाम के बारे में एक निश्चित विवरण चाहते हैं तो विनिर्देश पर जाएं।

तो: संबंधित प्राधिकरण C # विनिर्देश है, जो खंड 7.11 में बताता है:

&, ^, और |ऑपरेटरों तार्किक ऑपरेटर कहा जाता है।

यह आगे चलकर अंतर्निहित लॉजिकल ऑपरेटर्स को पूर्णांक, एन्यूमरेशन, बुलियन और नॉलेबल-बुलियन लॉजिकल ऑपरेटर्स में तोड़ देता है। उपयोगकर्ता-परिभाषित तार्किक ऑपरेटर भी हैं; विवरण के लिए युक्ति देखें।

खंड 7.12 में हमारे पास है

&&और ||ऑपरेटरों सशर्त तार्किक ऑपरेटर कहा जाता है। उन्हें "शॉर्ट-सर्कुलेटिंग" तार्किक ऑपरेटर भी कहा जाता है।

इसलिए ये सभी तार्किक परिचालक हैं। उनमें से कुछ सशर्त तार्किक ऑपरेटर हैं

क्या सशर्त तार्किक ऑपरेटरों बनाता सशर्त ? कोई अनुमान लगा सकता है कि ऐसा इसलिए है क्योंकि वे आमतौर पर सशर्त बयानों ( if) या सशर्त अभिव्यक्तियों ( ? :) में उपयोग किए जाते हैं। वास्तविक कारण विनिर्देश द्वारा दिया गया है:

&&और ||ऑपरेटरों की सशर्त संस्करण हैं &और |ऑपरेटरों: आपरेशन x && yआपरेशन से मेल खाती है x & y, सिवाय इसके कि yकेवल मूल्यांकन किया जाता है, तो xगलत नहीं है। ऑपरेशन ऑपरेशन से x || yमेल खाता है x | y, सिवाय इसके कि yमूल्यांकन किया जाता है केवल अगर xयह सच नहीं है।

सशर्त तार्किक ऑपरेटरों को इस प्रकार नामित किया जाता है क्योंकि बाएं हाथ के संचालन के मूल्य के आधार पर दाएं हाथ के संचालन का मूल्यांकन सशर्त रूप से किया जाता है।

हम इसे और अधिक स्पष्ट रूप से देख सकते हैं कि सशर्त तार्किक संचालक सशर्त अभिव्यक्तियों के लिए सिर्फ "वाक्यगत शर्करा" हैंx && yलिखने के लिए बस एक अधिक सुखद तरीका है x ? y : false, और लिखने के x || yलिए बस एक अधिक सुखद तरीका है x ? true : yसशर्त तार्किक अभिव्यक्तियां वास्तव में सशर्त अभिव्यक्ति हैं।

सशर्त तार्किक ऑपरेटर का एक उपयोगकर्ता-परिभाषित रूप भी है, और यह थोड़ा मुश्किल है। विवरण के लिए विनिर्देश देखें।

आगे पढ़ने, अगर इस विषय में आप रुचि रखते हैं:


3
@RobertHarvey: सही है, तथ्य यह है कि और बूल, पूर्णांक प्रकार या Enum प्रकारों पर काम कर सकते हैं लेकिन && केवल बूल पर चल रहे हैं, उनमें से एक ऑपरेटर के "सशर्त" रूप के नामकरण के विकल्प के साथ कुछ नहीं करना है। सशर्त ऑपरेटर सशर्त है क्योंकि इसके मूल्यांकन शब्दार्थ में एक सशर्त शाखा है।
एरिक लिपिपर्ट

16
मैं इस धारणा के तहत हूं कि "शॉर्ट-सर्किट ऑपरेटर" शब्द वर्णित अर्थों में "सशर्त ऑपरेटर" की तुलना में कहीं अधिक लोकप्रिय (और शायद कम अस्पष्ट) है।
डॉक्टर ब्राउन

15
@DocBrown: यह निश्चित रूप से लोकप्रिय है, लेकिन मैंने हमेशा उस नाम को भ्रामक पाया है; ऐसा लगता है कि किसी ऐसे व्यक्ति द्वारा गढ़ा गया है जिसने सोचा था कि "शॉर्ट सर्किट" और परिणाम प्राप्त करने के लिए "शॉर्ट कट" एक ही बात है। शॉर्ट सर्किट एक खतरनाक दोष है जो विद्युत प्रणाली को जल्दी से नष्ट कर सकता है। हमने C # "असुरक्षित" में "असुरक्षित" ब्लॉक का नाम दिया क्योंकि वे गलत तरीके से उपयोग किए जाने पर खतरनाक होते हैं ; आइए चीजों को कैटेसी न दें लेकिन मूल्य-भ्रामक नाम दें। मुझे एल्विस ऑपरेटर पर शुरू भी मत करो। :-)
एरिक लिपर्ट

26
@EricLippert: जबकि "शॉर्ट सर्किट" आम जनता को डरावना लग सकता है, मुझे नहीं लगता कि K & R वास्तविक परिभाषा के बारे में भ्रमित थे। इलेक्ट्रिकल इंजीनियरिंग में, सर्किट को छोटा करना हमेशा एक खतरनाक दोष नहीं होता है, वास्तव में हम इसे जानबूझकर हर समय करते हैं। इसका मतलब सिर्फ बिजली के एक छोटे हिस्से को फॉलो करने के लिए सर्किट के अनचाहे हिस्से को काटना है।
हैकरब

1
@CortAmmon: आप निम्नलिखित पैराग्राफ को पढ़ना चाहेंगे जहां मैं कहता हूं कि उपयोगकर्ता द्वारा परिभाषित ऑपरेटर शब्दार्थ थोड़े अलग हैं और आपको विवरण के लिए युक्ति देखनी चाहिए।
एरिक लिपर्ट

27

C # में ये सभी लॉजिकल ऑपरेटर हैं।

int x = 0xABCD & 0xFF // x == 0xCD

&&और ||उन्हें " सशर्त तार्किक ऑपरेटर" कहा जाता है, क्योंकि वे शॉर्ट-सर्कुलेटिंग हैं।

bool someOtherCondition = true;
if (x == 0xEF && someOtherCondition) // someOtherCondition is not evaluated, 
                                     // because x == 0xEF is false

ध्यान दें कि यह शब्दावली भाषा से भाषा में भिन्न है। सी और सी ++ में &&और ||सिर्फ लॉजिकल ऑपरेटर्स हैं। जावा में, &और बिटवाइज़ ऑपरेटर्स| कहा जाता है , जबकि C और C ++ उन्हें Arithmetic Operators के रूप में वर्गीकृत करता है ।


3
हां, Microsoft प्राधिकरण है, लेकिन आधिकारिक दस्तावेज विनिर्देश है। खंड 7.12, सशर्त तार्किक संचालक देखें
एरिक लिपर्ट

8
कहानी का नैतिक होना: यह समझना अधिक महत्वपूर्ण है कि ये ऑपरेटर अपने नामों के बारे में सटीक होने की तुलना में क्या करते हैं।
रॉबर्ट हार्वे

21
ऑपरेटर क्या करते हैं, इस पर ध्यान केंद्रित करें और शब्दावली के साथ अवलोकन करना बंद करें। नामकरण को हानिकारक भी देखें ।
रॉबर्ट हार्वे

4
+1। प्रश्न में सूचीबद्ध सब कुछ सिर्फ ऑपरेटर हैं जो एक या दो भाव लेते हैं और एक मूल्य का मूल्यांकन करते हैं। विशेषण अनावश्यक बालों को विभाजित करने वाले होते हैं।
Blrfl


-2

मुद्दा यह है कि है &और |कर रहे हैं बिटवाइज़ ऑपरेटरों, जिसका अर्थ है कि वे करने के लिए और उपज बिट श्रृंखला के मूल्यों लागू होते हैं। और बिटवाइस प्रोग्रामर के बीच एक बहुत इस्तेमाल किया जाने वाला शब्द है।

उदाहरण के लिए 0xff & 0x00 == 0x00, जबकि 0xff | 0x00 == 0xff

और &&और ||स्थिति के लिए आवेदन किया है, और शर्तों के सामान्य मूल्यों उपज कर रहे हैं; यानी trueऔर false

उदाहरण के लिए true && false == false, जबकि true || false == true

इसलिए &&और सशर्त ऑपरेटर ||कहे जा सकते हैं , भले ही यह प्रोग्रामर के बीच एक सामान्य शब्द नहीं है।

बेशक, हर C, C ++, Java और C # प्रोग्रामर को वह सब पता है। लेकिन मुझे लगता है कि गलतफहमी इसलिए होती है क्योंकि "सशर्त ऑपरेटर" एक शब्द नहीं है जिसका इस्तेमाल अक्सर हमारे प्रोग्रामर करते हैं।


5
बेशक, हर C, C ++, Java और C # प्रोग्रामर को वह सब पता है। यह लिखने के लिए बहुत अशिष्ट बात है, ओपी को बेवकूफ़ बनाना। हमें प्रोग्रामर लिखकर , आपने ओपी को बाहर कर दिया। कृपया ऐसा मत करो।
डार्कडस्ट नोव

1
मुझे नहीं लगता कि एरिक लिपर्ट के स्वीकृत जवाब के बाद आपका बाद वाला उत्तर किसी भी अतिरिक्त मूल्य को लाता है , और इसके अलावा प्रश्न के बिंदु को नहीं समझने के अर्थ में गलत है।
होन्ज़ा ज़िदेक

@DarkDust हर C, C ++, Java और C # प्रोग्रामर को उन ऑपरेटर्स को समझना चाहिए। यह असभ्य नहीं बल्कि एक तथ्य है
Phil1970

1
@ Phil1970: ओपी इन ऑपरेटरों को समझने लगता है, यह नामकरण के स्पष्टीकरण के बारे में है । इस प्रकाश में, और हिल्टन के उत्तर में प्रासंगिक शब्दों पर जोर देते हुए, उनके वाक्य की व्याख्या की जा सकती है, जिसका अर्थ है कि प्रत्येक प्रोग्रामर इन नामकरण विवरणों के बारे में जानता है, लेकिन आप नहीं । यह है गलत है (जैसा कि अन्य उत्तर की चर्चा में देखा जा सकता है) और उसके शब्दों अशिष्ट है।
डार्कडस्ट नोव

4
प्रिय सब, मुझे खेद है अगर मेरा जवाब कठोर लग रहा था। अंग्रेजी पहली भाषा नहीं है। किसी भी मामले में, मैंने कभी भी इसका मतलब नहीं निकाला कि ओपी एक प्रोग्रामर नहीं था। एयू गर्भनिरोधक, मेरा मतलब था कि वह पाठ में एक असामान्य नामकरण से भ्रमित था या वह पढ़ा था। मैंने जो कुछ भी करने की कोशिश की, वह कार्यक्रम के टुकड़ों द्वारा असामान्य नामकरण को स्पष्ट करना था।
हिल्टन फर्नांडीस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.