2012-05-16 16 views
29

मैं इस बारे में जानने जबकि शुरू भर में ठोकर खाई यहाँ वार्स:इसका क्या अर्थ है? int i = (i = 20);

http://msdn.microsoft.com/en-us/library/bb384061.aspx

हालांकि, मैं पता नहीं कैसे है कि एक कानूनी अभिव्यक्ति (यह है) है। मैंने सोचा था कि आप एक = (बी = सी) का उपयोग करके कुछ असाइन नहीं कर सके क्योंकि (बी = सी) असाइन करने के लिए कोई मान नहीं देता है?

इस मामले पर किसी भी स्पष्टीकरण के लिए धन्यवाद।

+2

के रूप में के रूप में अच्छा है '(i = 20)' रिटर्न 20. – BeemerGuy

+2

यह बयान if' 'में एक बहुत ही आम गलती है।'a == 10' –

+0

@ बेन ब्रॉक लेकिन int i = (i == 20) के बजाय' a = 10' संकलित नहीं होगा क्योंकि आप एक पूर्णांक में बूलियन मान असाइन करने का प्रयास कर रहे हैं। –

उत्तर

31

यह कानूनी है। = operator C# reference page से:

The assignment operator (=) stores the value of its right-hand operand in the storage location, property, or indexer denoted by its left-hand operand and returns the value as its result.

(जोर मेरा)

उदाहरण में कोड काल्पनिक है (और व्यर्थ), लेकिन यह एक और अधिक संक्षिप्त तरीके से उपयोगी काम करने के लिए अन्य मामलों में इस्तेमाल किया जा सकता है।उदाहरण के लिए:

BinaryTree tree; 
TreeNode node; 
if((node = tree.FindNodeForKey(10)) != null) 
{ 
    // do useful things with returned node 
} 
+2

यदि आप अलग-अलग चरों में समान मूल्य असाइन करेंगे, जैसे कि 'btnX.Visible = btnY.Visible = btnZ.Visible = false;', हालांकि यह पठनीय _ नहीं है (कम से कम इसके लिए मुझे) _। –

+0

मैं अभी भी 'TreeNode नोड = पेड़ लिखना चाहता हूं। FindNodeForKey (10); अगर (नोड! = शून्य) {} '। – Malcolm

+0

@ मैल्कम: मैं अभ्यास में इसका पक्ष लेता हूं। एकमात्र जगह जिसे मैं वास्तव में पसंद करता हूं वह 'लूप्स' में है। वहां लूप वैरिएबल को आवंटित करने के लिए कोड की दो पंक्तियां रखने से बचने में मदद मिलती है - लूप से पहले एक और उसके अंत में। शायद यह एक बेहतर उदाहरण होगा। ओह अच्छा। –

2

कोड गैर धागा सुरक्षित तरीका एक स्थानीय चर मैं करने के लिए शाब्दिक मूल्य 20 आवंटित करने के लिए है।

अभिव्यक्ति i = 20 पक्ष i करने के लिए 20 बताए का असर है, और काम के बाद i का मूल्य है। अभिव्यक्ति i = (i = 20) मुझे (i = 20) के मान निर्दिष्ट करती है, जो बाहरी असाइनमेंट के समय लगभग i है। अगर धागा बाधित हो जाता है, तो अभिव्यक्ति (i = 20) में अभी भी मान 20 होगा, हालांकि बाहरी असाइनमेंट होने पर मेरे पास एक अलग मूल्य हो सकता है।

कोई स्थिति है जिसमें आप इस सटीक कोड लिखने के लिए चाहते हो जाएगा नहीं है।

+1

मुझे यकीन नहीं है कि थ्रेड सुरक्षा को इसके साथ क्या करना है, या इसका क्या अर्थ है "जो लगभग हमेशा' i' का मान है। अभिव्यक्ति 'i = (i = 20) '20' i' असाइन करेगा। भले ही 'i' के साथ शुरू करना था। –

+0

यदि कोड अनुकूलित नहीं किया गया है और ओएस दो असाइनमेंट के बीच बाधा डालता है, तो अंतिम परिणाम मैं 20 से अधिक कुछ हो सकता हूं। जब मैंने कहा "जो हमेशा लगभग हमेशा का मूल्य है", मेरा मतलब था, "जो बाहरी असाइनमेंट के समय मेरे पास हमेशा वह मूल्य होता है। " अगर धागा बाधित हो जाता है, तो अभिव्यक्ति (i = 20) में अभी भी मान 20 होगा, हालांकि बाहरी असाइनमेंट होने पर मेरे पास एक अलग मूल्य हो सकता है। –

+0

मैंने अभी जवाब में जोड़ा है। –

4

यह विशेष रूप से कोड व्यर्थ है। असाइनमेंट अभिव्यक्ति उस मान को वापस लौटाती है जिसे अभी असाइन किया गया था। इसलिए, के परिणाम:

i = 20 

, बेशक 20 है,। इस प्रकार: इस तरह के छोरों के लिए के रूप में

i = 20; 

कभी कभी तथ्य यह है कि एक असाइनमेंट लौटाने कुछ उपयोगी हो सकता है:

i = (i = 20); 

के रूप में ही है

for (string line; (line = reader.ReadLine()) != null;) { ... } 

(यह क्या है के लिए लायक, मैं इस विशेष स्थिति में यह मुहावरा प्रयोग नहीं करेंगे)

या एकाधिक VA के लिए एक ही मान निर्दिष्ट riables:

int x, y; 
x = y = 5; 

अब, दोनों x और y मूल्य 5 है।

6

मैं बात उस तरह का उपयोग हर समय।

public class Parameters 
{ 
    public readonly bool ContainsSquareBrackets; 

    public Parameters(string paras) 
    { 
     if(ContainsSquareBrackets = paras.Contains(']') || paras.Contains('[')) 
     { 
      // do something ... 
     } 
    } 
} 
+0

प्रश्न पूछने से यह पूरी तरह से अलग है। तार्किक ऑपरेटरों 'सत्य/झूठी' वापस आते हैं। ओपी जानना चाहता है कि '(i = 20)' एक मूल्य देता है या नहीं। – xbonez

+0

मेरी अभिव्यक्ति (चर = बूल) एक ही चीज़ है, क्योंकि परिवर्तनीय बूल देता है। –

+0

ओह, आप सही हैं। मेरी गलती। अब यह एक दिलचस्प उपयोग है कि मैं इसे देखता हूं। (डाउनवोट पूर्ववत) – xbonez

14

MSDN से पूरे उद्धरण है:

Variables declared by using var cannot be used in the initialization expression. In other words, this expression is legal: int i = (i = 20); but this expression produces a compile-time error: var i = (i = 20);

मुद्दा यह है कि आप चर प्रारंभ अभिव्यक्ति में वर द्वारा घोषित उपयोग नहीं कर सकते है। दूसरे शब्दों में, यदि आप मुझे घोषित करने के लिए var का उपयोग करते हैं, तो आप = चिह्न के दूसरी तरफ मैं उपयोग नहीं कर सकते।

जैसा कि अन्य ने नोट किया है, आप वास्तव में यह कोड नहीं लिखेंगे। यह एक समेकित उदाहरण है।

3

यह सी # सी में the order of evaluation for operators is left to right डिफ़ॉल्ट रूप से सी/सी ++ भाषाओं के विपरीत है जो sequence point. में सीमा निर्धारित नहीं करते हैं। = ऑपरेटर 20 मान को असाइन करता है और परिणाम के रूप में मान देता है। यह के रूप में पार्स है:

int i; //<- i is declared. 
i = 20; // assign 20 to i variable and returns. 
i = i; // assign i as i value of. 

यह एक ambiguous expression

+1

'int i = (i = 20); ** ** ** ** सी/सी ++ – vsz

+0

@vsz में अनिर्धारित व्यवहार नहीं है: आप सही, संपादित हैं। –

0

यहां तक ​​कि निम्नलिखित सी में भी मान्य है ++ और है सी दोनों #:

पूर्णांक i = i = i = 20;

ऊपर दिया गया बयान दाएं से बाएं ऑपरेंड से वाल्व असाइन करने वाले असाइनमेंट ऑपरेटर का एक सरल उपयोग है।

0

आप एक वैरिएबल घोषित करने के तरीके पर एक ही दृष्टिकोण कर सकते हैं .. यह केवल पढ़ने वाला व्यक्ति इसे पढ़ने के लिए जटिल बनाता है।

यह है मौजूद है, क्योंकि यह हालांकि यह i = 20 रूप में एक ही मतलब है .. मेरी राय अपनी उपस्थिति सुरक्षा के लिए एक गहरी संबंध नहीं था में कोड अंधेरा करना

1

इस्तेमाल किया जा सकता है, यह कुछ स्थितियों में एक उपयोगी उद्देश्य हो सकता है।

किसी और अपने कोड को बनाए रखेंगे, और कुछ इस तरह देखता है:

if (i = some_function()) 

उन्हें लगता है कि हो सकता है यह एक गलती है और == साथ = relpace। संकेत करने के लिए यह आप क्या करने का इरादा क्या है, आप

if (i = (i = some_function())) 

का उपयोग हालांकि, मैं व्यक्तिगत रूप से if (i = /* = */ some_function()) पा सकते हैं या सिर्फ i = some_function(); if (i) क्लीनर किया जाना है।

0

असाइनमेंट ऑपरेटर असाइन किए गए मान को वापस देता है।

इस प्रकार,

i = 20 

रिटर्न 20

जो मैं करने के लिए सौंप दिया जाता है।

तो,

i = (i = 20); 

i = 20; 
संबंधित मुद्दे