2012-10-05 11 views
17

मैं इस निम्नलिखित कोड है होना चाहिए:अभिव्यक्ति एक परिवर्तनीय lvalue

int M = 3; 
int C = 5; 
int match = 3; 
for (int k =0; k < C; k ++) 
{ 
    match --; 
    if (match == 0 && k = M) 
    { 
     std::cout << " equals" << std::endl; 
    } 
} 

लेकिन यह कह रही है एक त्रुटि देता है: कि "अगर" लाइन पर

Error: expression must be a modifiable value

। मैं यहां "मैच" या "के" मान को संशोधित करने की कोशिश नहीं कर रहा हूं, लेकिन यह त्रुटि क्यों? अगर मैं इसे केवल लिखता हूं:

if (match == 0) 

यह ठीक है। क्या कोई इसे मुझे समझा सकता है?

+7

क्या आपका मतलब 'k == एम' था? –

+1

'के == एम' नहीं 'के = एम' – Shashwat

+3

आप भाग्यशाली हैं कि इसके परिणामस्वरूप गलत प्रोग्राम तैयार करने के बजाय' && 'और' = 'की ऑपरेटर प्राथमिकताओं के कारण एक कंपाइलर त्रुटि हुई! – Rufflewind

उत्तर

29

असाइनमेंट ऑपरेटर, && की तुलना में कम पूर्वता है क्या करना चाहते है तो अपनी हालत के बराबर है:

if ((match == 0 && k) = m) 

लेकिन बाएं हाथ की ओर इसका एक उपन्यास है, अर्थात् उप ­ अभिव्यक्ति match == 0 && k के मूल्यांकन से उत्पन्न बूलियन, इसलिए आप इसे असाइन नहीं कर सकते हैं।

इसके विपरीत, तुलना में अधिक पूर्वता है, तो match == 0 && k == m के बराबर है:

char array[size]; 

और कोशिश की तुलना में:

if ((match == 0) && (k == m)) 
3

याद रखें कि एक = हमेशा सी या सी ++ में असाइनमेंट होता है।

आपका परीक्षण if (match == 0 && k == M) होना चाहिए आपने k == M परीक्षण पर एक टाइपो बनाया है।

यदि आप वास्तव में k=M (यानी एक परीक्षण के अंदर एक साइड-इफेक्टिंग असाइनमेंट) का मतलब है तो आपको पठनीयता के कारण कोड if (match == 0 && (k=m) != 0) कोड करना चाहिए, लेकिन अधिकांश कोडिंग नियम इसे लिखने की सलाह नहीं देते हैं।

बीटीडब्लू, आपकी गलती सभी चेतावनियों के लिए पूछने का सुझाव देती है (उदाहरण के लिए -Wall विकल्प g++), और हाल के कंपाइलरों में अपग्रेड करने के लिए। अगले जीसीसी 4.8 आप दे देंगे:

% g++-trunk -Wall -c ederman.cc 
ederman.cc: In function ‘void foo()’: 
ederman.cc:9:30: error: lvalue required as left operand of assignment 
      if (match == 0 && k = M) 
          ^

और बजना 3.1 भी आप ederman.cc:9:30: error: expression is not assignable

बताता है तो मुक्त compilers के हाल के संस्करणों का उपयोग करें और जब उन्हें प्रयोग सभी चेतावनियों को सक्षम करें।

2

आप k == M के बजाय k = M का परीक्षण करते हैं।
शायद यह है कि तुम क्या, इस मामले में, लिखने if (match == 0 && (k = M))

9

सी में, आप भी वही त्रुटि यदि आप एक घोषित अनुभव करेंगे इंडेक्स स्थिति निर्दिष्ट किए बिना मूल्य असाइन करने के लिए:

array = '\0'; 

ऐसा करके:

array[index] = '0\'; 

आप पहले घोषित सुलभ/संशोधित पते निर्दिष्ट कर रहे हैं।