2010-10-09 30 views
9

त्रुटि संदेश "Lvalue आवश्यक" वास्तव में क्या मतलब है?lvalue आवश्यक

+0

["एल-वैल्यू आवश्यक" त्रुटि के संभावित डुप्लिकेट (http://stackoverflow.com/questions/1353384/l-value-required-error) –

+0

@Paul हालांकि सी ++ के बारे में है। –

उत्तर

7

एक lvalue जहां बाएं हाथ की ओर 'आबंटित' नहीं है

'कि सौंपा जा सकता है कुछ' तो, एक काम के लिए देखो कुछ है कि एक काम के बाईं ओर प्रदर्शित हो सकते, दूसरे शब्दों में है उदाहरण के लिए, इस के रूप में सरल कुछ इस तरह के एक त्रुटि

if (0 = foo) 
{ 

} 

यहाँ आप क्योंकि गलती से नहीं बल्कि == से = का उपयोग कर

भी देखें

की एक निरंतर करने के लिए आवंटित करने की कोशिश मिल गया है ट्रिगर हो सकता है
5

इसका मतलब कार्यान्वयन एक वस्तु की उम्मीद है, लेकिन आप केवल एक मूल्य या समारोह पारित कर दिया। ऐसा असाइनमेंट के लिए होता है जिसे आपने गैर-कार्यकाल या गैर-कार्यों पर लागू संचालन के पते के लिए पारित किया है।

लाल्वु "स्थान मान" के लिए खड़ा है और इसका अर्थ है एक ऑब्जेक्ट जो किसी ऑब्जेक्ट को register या स्मृति स्थान के रूप में घोषित करता है। 42 कुछ ऐसा मान है जो न तो मानदंड से मेल खाता है। अधिक औपचारिक रूप से तीन श्रेणियां हैं

  • लालसा: वस्तुओं का जिक्र करना। इसमें घोषित घोषित वस्तुएं शामिल हैं। ऐसे गैर-संशोधित अंतराल हैं।
  • फ़ंक्शन डिज़ाइनर: फ़ंक्शंस का जिक्र करना। printf एक फ़ंक्शन डिज़ाइनर है, लेकिन &printf नहीं है, जबकि *&printf फिर से है।
  • अन्य: कभी-कभी "रावल्यू" कहा जाता है और मानक द्वारा "अभिव्यक्ति का मूल्य" के रूप में वर्णित किया जाता है। उदाहरण var + 0 (ऑब्जेक्ट्स से जुड़े मूल्य को उपज नहीं कर रहे हैं), या गणना के गणक हैं। &printf इस श्रेणी से संबंधित है।
0

त्रुटि अगर आप function(parameter) = value; जैसे कुछ कोड करते हैं तो त्रुटि आती है क्योंकि आप किसी भी चीज़ के लिए मूल्य असाइन नहीं कर सकते हैं जो इसके लिए संभावित कंटेनर नहीं है।

2

C99 मानक राज्यों (6.3.2.1):


एक lvalue एक वस्तु प्रकार या एक अधूरी शून्य के अलावा अन्य प्रकार के साथ एक अभिव्यक्ति है; यदि lvalue किसी ऑब्जेक्ट को मूल्यांकन करते समय निर्दिष्ट नहीं करता है, तो व्यवहार अपरिभाषित है। जब किसी ऑब्जेक्ट को एक विशेष प्रकार कहा जाता है, तो ऑब्जेक्ट को निर्दिष्ट करने के लिए उपयोग किए गए lvalue द्वारा निर्दिष्ट किया गया है। एक संशोधित lvalue एक lvalue है जिसमें सरणी प्रकार नहीं है, इसमें अपूर्ण प्रकार नहीं है, इसमें कोई कॉन्स्ट-क्वालिटी प्रकार नहीं है, और यदि यह संरचना या संघ है, तो इसमें कोई सदस्य नहीं है (जिसमें, किसी भी सदस्य, या सभी निहित समेकन या संघों का तत्व) एक कॉन्स-योग्य प्रकार के साथ।

नाम lvalue काम अभिव्यक्ति E1 = E2, जिसमें बाईं संकार्य E1 एक (परिवर्तनीय) lvalue होना आवश्यक है मूल रूप से आता है। यह शायद एक वस्तु "लोकेटर मूल्य" का प्रतिनिधित्व करने के रूप में बेहतर माना जाता है। कभी-कभी rvalue कहा जाता है जिसे इस अंतर्राष्ट्रीय मानक में "अभिव्यक्ति का मूल्य" कहा जाता है।


दूसरे शब्दों में, एक lvalue कुछ है कि आप संभावित रूप से बदलने के लिए पता लगाने कर सकते हैं। एक संशोधित lvalue वह है जिसे आप वास्तव में बदलने के लिए की अनुमति देते हैं।

उदाहरण के लिए, सी बयान: क्योंकि x एक lvalue है

x = 7; 

मान्य है। दूसरी ओर, बयान:

14 = 7; 

मान्य नहीं 14नहीं कुछ आप एक काम के लिए पता लगा सकते हैं, क्योंकि है।

टुकड़ा:

const int x = 7; 

वास्तव में बनाता है एक lvalue बुलाया x भले ही आप इसे बदलने के लिए अनुमति नहीं कर रहे हैं (यह एक परिवर्तनीय `lvalue नहीं है)।

+1

नाइट पिकिंग, लेकिन तकनीकी रूप से यह एक वैरिएबल भी हो सकता है जिसे 'रजिस्टर' के साथ घोषित किया गया है, इसलिए इसमें कोई पता नहीं हो सकता है। –

+0

"_if एक lvalue किसी ऑब्जेक्ट को मूल्यांकन करते समय निर्दिष्ट नहीं करता है, व्यवहार अपरिभाषित होता है ._" जब व्यवहार _not_ अपरिभाषित होता है: '& * (int *) 0; '(sic) – curiousguy

0

सबसे अधिक संभावना है कि आप किसी ऐसे मूल्य को असाइन करने का प्रयास करते हैं जिसे असाइन नहीं किया जा सकता है। उदाहरण के लिए, निम्नलिखित में से दोनों शायद उस त्रुटि का कारण बनेंगे:

5 = 5; myObject-> myMethod() = 5;