2008-11-13 5 views
8

मैं दो चर और नहीं दो विधि कॉल का मूल्यांकन कर रहा हूँ अगर यह मौसम मैं उपयोग फर्क पड़ता है "& &" या "&"वहाँ एक समय था जब && (andalso) पर कोई फर्क नहीं पड़ता और (और)

//some logic that sets bool values 

boolean X = true; 
boolean Y = true; 

if (X & Y){ 
    // perform some operation 
} 

if (X && Y){ 
    // perform some operation 
} 

आगे एक पुस्तक जो मैं सी # 3.0/.NET 3.5 के लिए उपयोग कर रहा हूं केवल & & ऑपरेटर का संदर्भ देती है, & ऑपरेटर दूर जा रहा है?

उत्तर

3

जैसा कि देखा गया है, & बिटवाई और ऑपरेटर है। रॉ बाइनरी गणित समय के साथ कम और कम आम प्रतीत होता है, डेवलपर्स की बढ़ती संख्या वास्तव में बिटवाई अंकगणित को समझ नहीं पाती है। जो कभी-कभी दर्द हो सकता है।

हालांकि ऐसे कई कार्य हैं जो इस तरह से हल किए जाते हैं, विशेष रूप से कुछ भी जो झंडे के रूप में डेटा को देखता है। & ऑपरेटर 100% आवश्यक है, और कहीं भी नहीं जा रहा है - यह बस बूलियन शॉर्ट-सर्किटिंग && ऑपरेटर के रूप में अक्सर उपयोग नहीं किया जाता है।

उदाहरण के लिए:

[Flags] 
enum SomeEnum { // formatted for space... 
    None = 0, Foo = 1, Bar = 2 // 4, 8, 16, 32, ... 
} 
static void Main() { 
    SomeEnum value = GetFlags(); 
    bool hasFoo = (value & SomeEnum.Foo) != 0; 
} 
static SomeEnum GetFlags() { ... } 
9

यदि आप सही/गलत तर्क परीक्षण कर रहे हैं तो हमेशा & & का उपयोग करें। एक & थोड़ा-सा 'और' करता है। यह कुछ मामलों में एक तर्क परीक्षण की तरह काम करता है लेकिन सभी तर्क मामलों के लिए काम करने की गारंटी नहीं है। एक बिट-मास्क लगाने पर एक & का सबसे आम उपयोग होता है।

उदाहरण (& &):

true && true == true 

उदाहरण (&):

00101001 & 00100001 = 00100001 
1

& जबकि & & AND ऑपरेटर है एक बिटवाइज़ ऑपरेटर है। दो पूरी तरह से अलग संचालन।

int a = 1; 
int b = 2; 
assert (a & b == 0) 
assert (a && b == true) 

संपादित करें: ओउप्स ... यह उदाहरण सी # में काम नहीं करता है। यह सी ++ में होना चाहिए। उम्मीद है कि यह दो ऑपरेटरों के बीच इरादे और अंतर को दर्शाता है।

+0

सी में # के रूप में इरादा एक भी और कार्य करता है। –

+0

मैंने कोशिश की और संकलक ने शिकायत की: ऑपरेटर 'और' प्रकार 'int' और 'bool' के संचालन पर लागू नहीं किया जा सकता है – jpoh

+0

Thats क्योंकि int 8-बिट मान नहीं है। इसे काम करने के लिए आपको बाइट को एक int में डालना होगा। – FlySwat

7

यदि आप एक & (और) का उपयोग करते हैं तो अभिव्यक्ति के दूसरे भाग का मूल्यांकन किया जाता है। यह बुरा हो सकता है यदि दूसरा भाग पहले भाग पर निर्भर करता है। आम तौर पर हमेशा & & का उपयोग करें क्योंकि दूसरे भाग का मूल्यांकन नहीं किया जाता है यदि पहला भाग गलत है।

तार्किक रूप से एकल & थोड़ा सा ऑपरेशन करता है जैसा कि अन्य ने कहा है, जो अभी भी बूलियन तुलना/मूल्यांकन के लिए मान्य है। वास्तव में केवल एक ही समय & (या |) का उपयोग किया जाना चाहिए (या बूलियन मूल्यांकन) यदि दूसरा मूल्यांकन हमेशा चलाना चाहिए (यदि यह फ़ंक्शन कॉल/संशोधक है)। यह बुरा अभ्यास है और संभवतः पुस्तक का उल्लेख क्यों नहीं करता है।

सिंगल & फ्लैग एनम्स और बिट मास्क के साथ उपयोगी हैं।

निम्नलिखित obj की एक अपवाद फेंक होगा रिक्त है:

bool b = obj != null & obj.IsActive 

लेकिन यह काम करेगा:

bool b = obj != null && obj.IsActive 

यह बुरा है:

bool b = obj.IsActive && obj.SetActive(false); 
bool b = obj.IsActive & obj.SetActive(false); 

& ऑपरेटर यहाँ है रहने के लिए।

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