2017-11-11 21 views
6

मैं lvalue के बारे में कुछ बातें समझने कोई सरणी है, लेकिन मुझे समझ नहीं आता कि कैसे नीचे कोड एक त्रुटि देता है:क्यों foo ((& i) ++) Lvalue आवश्यक त्रुटि देता है। वहाँ जुड़े

#include<stdio.h> 

void foo(int *); 

int main() 
{ 
    int i=10; 
    foo((&i)++); 
} 

void foo(int *p) 
{ 
    printf("%d",*p); 
} 

6:13: त्रुटि: lvalue वेतन वृद्धि संकार्य foo के रूप में आवश्यक ((& i) ++); ^

+3

क्योंकि 'और मैं' घ एक * lvalue * नहीं है, और '++' ऑपरेटर एक की आवश्यकता है। यह लगभग 'और i = &i + 1;' के बराबर है, क्या अंतिम अभिव्यक्ति आपको समझ में आता है? –

+1

परिवर्तनीय 'i' जब उपयोग किया जाता है वह एक लवल्यू होता है। यदि आपके पास 'int * p = & i; 'जैसे पॉइंटर था तो' p' भी एक लवल्यू होगा। लेकिन 'और मैं स्वयं * एक * लाभा नहीं है। शायद आपको [इस मूल्य श्रेणी संदर्भ] में दिलचस्पी होगी (http://en.cppreference.com/w/c/language/value_category)? ध्यान दें कि कैसे [गैर-आभासी अभिव्यक्तियों की सूची] (http://en.cppreference.com/w/c/language/value_category#Non-lvalue_object_expressions) में "ऑपरेटर का पता" शामिल है। –

+0

[संभावित वृद्धि के रूप में आवश्यक लैवल्यू] [https://stackoverflow.com/questions/3364445/lvalue-required-as-increment-operand) – ssharma

उत्तर

2

x ++ निम्नलिखित चरणों का परिणाम।

1) read the value of x in to register. 
2) increment the value of x 
3) write the incremented value back to x (which means you are changing the value of x by '1') 

लेकिन तुम क्या करने की कोशिश कर रहे हैं (& i) ++ जो निम्नलिखित का मतलब है।

1) read address of i into register 
2) increment the address by 1 
3) write the incremented value in to address again? How you can change the address? 

आप पूर्णांक जो foo के बगल में पता में संग्रहित है भेजना चाहते हैं(), आप नीचे के रूप में बढ़ाने के लिए की जरूरत है।

int *p = &i + 1; 
foo(p); 

लेकिन इसका परिणाम अपरिभाषित व्यवहार में हो सकता है क्योंकि आप केवल उस पते का पता करते हैं जहां मैं मूल्य संग्रहीत करता हूं। एक बार जब आप पता बढ़ाएंगे, तो आपको अगला पता मिलेगा और इसमें कुछ जंक वैल्यू हो सकती है।

1

यूनरी ऑपरेटर & को अस्थायी ऑब्जेक्ट पर लागू करने का प्रयास है जिसे (&i)++ अभिव्यक्ति के रूप में मूल्यांकन किया गया है। आप ऑपरेटर को एक अस्थायी वस्तु पर लागू नहीं कर सकते हैं।

सी मानक (6.5.3.2 पता और अविवेक ऑपरेटरों):

1 The operand of the unary & operator shall be either a function designator, the result of a [] or unary * operator, or an lvalue that designates an object that is not a bit-field and is not declared with the register storage-class specifier.

+1

"* एक अस्थायी ऑब्जेक्ट को लागू करने का प्रयास है '&' अस्थायी वस्तु ... * "निश्चित है? 'i'' पर लागू किया गया है। मेरे लिए ऐसा लगता है कि आप '&' और '++' मिश्रण करते हैं। – alk

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