2008-11-19 21 views
6
  1. ऑपरेटर '&' बूल के लिए परिभाषित क्यों किया गया है, और ऑपरेटर '& &' नहीं है?
  2. यह वास्तव में कैसे करता है 1) बूल? & बूल? और 2) बूल? और बूल काम?

कोई अन्य "दिलचस्प" ऑपरेटर अर्थशास्त्र नलबल पर? जेनेरिक टी के लिए कोई ओवरलोडेड ऑपरेटर?Nullable <T>: और ओवरलोडेड ऑपरेटर, बूल? और बूल

उत्तर

11

ऑपरेटरों पर 01: कोई छोटी-सर्किटिंग ऑपरेटरों (& & ||) केवल, ऑपरेटरों तार्किक और, शामिल हैं या और वे इस तरह व्यवहार के लिए bool?

परिभाषित कर रहे हैंऑपरेटर "उठाए गए" हैं। इसका क्या अर्थ है: यदि टी ऑपरेटर है, टी? "उठाया" समकक्ष होगा।

& & और || वास्तव में ऑपरेटरों को & के समान अर्थ में नहीं हैं और | - उदाहरण के लिए, वे अतिभारित नहीं किया जा सकता - ECMA कल्पना 14.2.2 ऑपरेटर ओवरलोडिंग से:

overloadable द्विआधारी ऑपरेटरों हैं: + - * /% & |^< < >> ==! => <> = < = ऊपर सूचीबद्ध ऑपरेटर ओवरलोड हो सकते हैं। ?, जाँच, अनियंत्रित नई, typeof, के रूप में, और ऑपरेटरों है: विशेष रूप से, यह सदस्य का उपयोग, विधि मंगलाचरण, या =, ओवरलोड & &, ||, ??, संभव नहीं है।

इसी तरह, ECMA कल्पना से, 14.2.7 लिफ़्टेड ऑपरेटरों, उठा लिया ऑपरेटरों हैं:

एकल ऑपरेटरों + ++ के लिए - - ~

बाइनरी ऑपरेटरों के लिए + - * /% & |^< < >>

समानता ऑपरेटरों के लिए ==!=

संबंधपरक ऑपरेटर < के लिए> < => =

तो बुनियादी तौर पर, शॉर्ट-सर्किट ऑपरेटरों को उठा लिया ऑपरेटरों के रूप में परिभाषित नहीं कर रहे हैं।

[संपादित करें: जोड़ा पालना शीट]

  • लिफ़्टेड ऑपरेटर: Nullable<T> पर एक संकलक प्रदान की ऑपरेटर, टी के ऑपरेटरों के आधार पर - उदाहरण के लिए: int "+" ऑपरेटर int? पर "उठाया" हो जाता है ,

    (int? x, int? y) => (x.HasValue & & y.HasValue)? (x.Value + y.Value): (int?) शून्य;

  • ऑपरेटर ओवरलोडिंग: किसी दिए गए प्रकार के लिए कस्टम ऑपरेटर कार्यान्वयन प्रदान करने का कार्य; दूसरे संकार्य यानी मूल्यांकन नहीं किया जा सकता है - - यानी

    && और || (सी ++ और सी # सहित कई भाषाओं में) के सामान्य व्यवहार: उदाहरण के लिए decimal और DateTime विभिन्न ऑपरेटर overloads

  • लघु सर्किटिंग प्रदान

    (अभिव्यक्ति 1, अभिव्यक्ति 2) => अभिव्यक्ति 1()? अभिव्यक्ति 2(): झूठी;

या शायद एक सरल उदाहरण:

bool someFlag = Method1() && Method2(); 

Method1() अगर रिटर्न झूठी, तो Method2() निष्पादित नहीं किया गया है (संकलक पहले से ही जानता है के बाद से है कि कुल मिलाकर जवाब गलत है)। यह महत्वपूर्ण है यदि Method2() के साइड इफेक्ट्स हैं, क्योंकि डेटाबेस में बचत ...

+0

धन्यवाद। हालांकि, सी ++ के बाद, यह सब शब्दावली ... शॉर्ट-सर्किट, उठाया गया ... ओवरराइड करने की असंभवता और ... मुझे बहुत अजीब लगता है :) – badbadboy

+0

मैं एक पालना शीट जोड़ूंगा ;- –

+0

@Marc Gravell: धन्यवाद !! – badbadboy

1

ऑपरेटर "&" बिटवाई ऑपरेटर है, ¨whereas "& &" लॉजिकल ऑपरेटर है। तर्कसंगत "और" ऑपरेटर को केवल दोस्ती के लिए, threestate मूल्य के लिए लागू नहीं किया जा सकता है।

0

- इसके अतिरिक्त, तार्किक & & ऑपरेटर के साथ || ऑपरेटर ओवरलोड नहीं किया जा सकता है।

2) कारण यह है कि बिटवाइज़ ऑपरेटर काम करता है, क्योंकि यह एक बिट पर चल रही है, जो कि एक साधारण 1 या 0. यह वह जगह है क्या बूलियन ऑपरेटरों को अनिवार्य रूप से, कर रहे हैं, सच और झूठी 1 और 0.

+0

??? यहां एक डाउनवोट के लिए कोई कारण है? –

3

नहीं है

x  y  x & y x | y 
true true true true 
true false false true 
true null null true 
false true false true 
false false false false 
false null false null 
null true null true 
null false false null 
null null null null 
+0

धन्यवाद। शायद यह भी समझाया जा सकता है कि उन्हें लघु-सर्किटिंग क्यों कहा जाता है, इन && और || ? – badbadboy

+1

वे "शॉर्ट-सर्किटिंग" हैं क्योंकि यदि आवश्यक हो तो वे केवल तार्किक वक्तव्य में कई स्थितियों का मूल्यांकन करते हैं। अधिक जानकारी के लिए http://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Logical_Operators देखें। –

संबंधित मुद्दे