2012-05-18 10 views
6

मैं this other stack overflow question about files and directories पाया, और जवाब इस बयान शामिल हैं:एक कथन में दोनों = और == कैसे हो सकते हैं?

bool isDir = (File.GetAttributes(path) & FileAttributes.Directory) 
      == FileAttributes.Directory; 

उनका सवाल .net के बारे में था, और मैं दृश्य स्टूडियो में सी # .net में कोडिंग किया गया था। क्या एक ही कथन में एक असाइनमेंट ऑपरेटर और बराबर ऑपरेटर दोनों की क्षमता सभी .NET भाषाओं के लिए काम करती है या यह निश्चित लोगों के लिए विशिष्ट है? साथ ही, क्या मैं उपर्युक्त कोड कैसे काम करता है इसके लिए एक स्पष्टीकरण प्राप्त कर सकता हूं? मान लें कि path एक निर्देशिका को संदर्भित करता है, मैं isDir को सत्य होने की उम्मीद करता हूं, लेकिन क्या कोई यह समझा सकता है कि क्यों?

+2

निश्चित रूप से आपने 'बूलियन नंबरEqualsFive = num == 5', कोड जैसे कोड लिखे हैं? –

+1

[प्राथमिकता और मूल्यांकन के आदेश] के लिए कुछ और संदर्भ (http://msdn.microsoft.com/en-us/library/2bxt6kc4.aspx) और [यहां विशेष रूप से सी # के लिए] (http://msdn.microsoft.com /en-us/library/aa691323(v=vs.71).aspx) –

+0

यह कोड 'File.GetAttributes' के परिणाम को गीला कर देता है, जिसमें बाइनरी ध्वज बिट' FileAttributes.Directory' शामिल है। –

उत्तर

13

== ऑपरेटर द्वारा किए गए समानता परीक्षण = ऑपरेटर द्वारा किए गए असाइनमेंट पर प्राथमिकता लेता है। इसलिए, isDir वैरिएबल true के बराबर सेट किया जाएगा यदि == ऑपरेटर के दोनों पक्ष बराबर हैं, अन्यथा यह false पर सेट किया जाएगा। दूसरे शब्दों में, यह कहने के बराबर है:

if ((File.GetAttributes(path) & FileAttributes.Directory) == FileAttributes.Directory) 
    isDir = true; 
else 
    isDir = false; 

यह वीबी.नेट में संभव है। मैं अन्य भाषाओं के लिए जवाब नहीं दे सकता। VB.NET में, बराबर होगा:

Dim isDir As Boolean = ((File.GetAttributes(path) And FileAttributes.Directory) = FileAttributes.Directory) 

वीबी के बाद से, दोनों यह काम और समानता परीक्षण ऑपरेटरों है के लिए एक ही चरित्र (=) का उपयोग करता है यह आप संदर्भ के आधार पर प्रदर्शन कर रहे हैं जो आपरेशन निर्धारित करता है। वीबी कंपाइलर यह जानकर काफी समझदार है कि पहले = ऑपरेटर एक असाइनमेंट है और दूसरा एक समानता परीक्षण है। हालांकि, यह स्पष्ट रूप से भ्रमित है, इसलिए इसे अक्सर पठनीयता के लिए निराश किया जाता है। यह विशेष रूप से अन्य भाषाओं में पृष्ठभूमि वाले लोगों के लिए भ्रमित है। उदाहरण के लिए, सी # में, आप एक ही मूल्य के लिए दो चर सेट करने के लिए निम्न कर सकता है:

int y; 
int x = y = 5; // Both x and y will be set to 5 

= हमेशा एक असाइनमेंट ऑपरेटर है, और काम अभिव्यक्ति हमेशा के लिए मूल्यांकन करता है क्योंकि कारण यह है कि सी # में होता है (रिटर्न) असाइन किया गया मान। इसलिए, इस मामले में, अभिव्यक्ति y = 5 न केवल वैरिएबल y पर मान 5 निर्दिष्ट करती है, लेकिन यह 5 के मान के मूल्यांकन भी करती है। इसलिए, जब आप उस अभिव्यक्ति के मान पर x सेट करते हैं, तो यह 5 पर भी सेट हो जाता है। वीबी में, हालांकि, परिणाम बहुत अलग है:

Dim y As Integer 
Dim x As Integer = y = 5 

वीबी में, संकलक, समझेंगे कि अभिव्यक्ति y = 5 एक समानता परीक्षण है, इसलिए यह False करने का मूल्यांकन करेंगे। इसलिए, यह x = False सेट करने का प्रयास करेगा जो Option Strict के मान के आधार पर काम कर सकता है या नहीं।

2

== एक ऑपरेटर है जो सी # में बूलियन लौटाता है। isDir को उस ऑपरेटर का परिणाम सौंपा जा रहा है। यह सी # तक ही सीमित नहीं है, लेकिन सभी .NET भाषाओं के लिए जरूरी नहीं है (उदाहरण के लिए, जहां तक ​​मुझे पता है कि वीबी .नेट अभी भी समानता परीक्षण के लिए एकल बराबर का उपयोग करता है)।

6

यहां बताया गया है कि उपरोक्त कोड कैसे काम करता है। दाएं हाथ की ओर केवल सही या गलत का मूल्यांकन होता है, इसलिए समानता (==) ऑपरेटर। उस मान को असाइनमेंट (=) ऑपरेटर का उपयोग करके सेट किया जाता है।

एक अन्य उदाहरण है जहां दोनों ऑपरेटरों उपयोग किया जाता है (हालांकि अलग ढंग से) आईओ फ़ाइल में है:

while((line = streamReader.ReadLine()) != null) 
{ 
    //do file IO 
} 
+1

यह एक अर्थात् समकक्ष उदाहरण नहीं है। ओपी का उदाहरण एक चर के लिए एक बुलियन अभिव्यक्ति का परिणाम असाइन करता है। आपका उदाहरण असाइनमेंट करता है और फिर शून्य के विरुद्ध निर्दिष्ट मान का परीक्षण करता है। –

+1

सहमत हुए, और ओपी को उस पर ध्यान देना चाहिए। मुझे लगा कि यह ओपी को एक और परिदृश्य दिखाने के लिए चोट नहीं पहुंचा सकता है, जहां इन दोनों ऑपरेटरों को एक ही स्थान पर उपयोग किया जाता है। – kmarks2

+0

शायद यह सटीक नहीं है, लेकिन ओपी ने एक असाइनमेंट और तुलना ऑपरेटर दोनों के एक बयान के बारे में पूछा। यह निश्चित रूप से एक प्रासंगिक उदाहरण है। –

3

= असाइनमेंट ऑपरेटर है, यह isDir

== का मूल्य स्थापित कर रही है एक तुलना है ऑपरेटर, और यह देखने के लिए जांच कर रहा है कि दोनों तरफ के मान बराबर हैं

5

असाइनमेंट होने से पहले रावल्यू का मूल्यांकन किया जाता है। रैवल्यू एक समानता तुलना है। तुलना का नतीजा एक बुलियन सत्य या झूठा है, जिसे निश्चित रूप से एक बूल को सौंपा जा सकता है।

यह

if((File.GetAttributes(path) & FileAttributes.Directory) 
      == FileAttributes.Directory) 
{ 
    isDir = true; 
} 
else 
{ 
    isDir = false; 
} 

कह की तरह ही है लेकिन अधिक संक्षिप्त है।

यह एक ही कथन में असाइनमेंट और समानता का कुछ विशेष मामला नहीं है। आप की तरह

bool bar, baz, qux; 
bar = qux = false; 
baz = true; 
bool foo = (bar || baz || qux); // foo is true 

foo सच हो जाता है झंडे bar, baz, या qux के किसी भी सच है कुछ कर सकते हैं। आप किसी रावल्यू में किसी भी अभिव्यक्ति का मूल्यांकन कर सकते हैं।

1

यह कथन फ़ाइल पथ के लिए गुण प्राप्त कर रहा है (एक झंडे enum के साथ) और यह है कि निर्देशिका के लिए enum मान के साथ (यह अनिवार्य रूप से FileAttributes.Directory का प्रतिनिधित्व करने वाले को छोड़कर 0 के enum के सभी बिट्स मिटा देता है। तो है कि आपरेशन के परिणाम तुलना करता है, तो यह वास्तव में FileAttributes.Directory का प्रतिनिधित्व enum मूल्य के बराबर है कि आपरेशन के परिणाम तो isDir चर में संग्रहीत किया जाता है देखने के लिए

इस कोड के बराबर है:।।

FileAttributes pathAttributes = File.GetAttributes(path); 
FileAttributes checkForDirectory = pathAttributes & File.GetAttributes(path); 
bool isDir = checkForDirectory == FileAttributes.Directory; 

ध्वज enums कैसे काम करता है के बारे में अधिक जानकारी के लिए (जो है FileAttributes है) देखें: Enums

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

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