Not able to understand error condition wrt lvalues

2020-04-13 02:54发布

问题:

I am a beginner in programming and was trying out some combinations.

#include<stdio.h>


int main()
{
int a=5;

printf("%d",&a); // STATEMENT 1
printf("\n%d",a); //STATEMENT 2
printf("\n%d",&(a++)); //STATEMENT 3
printf("\n%d",a);  //STATEMENT 4

return 0;
}

I get a error in STATEMENT 3 saying

[Error] lvalue required as unary '&' operand

I expected the output of STATEMENT 1 & 3 to be same as both address are the same.

Also I expected the output of STATEMENT 2 to be 5 & STATEMENT 4 to be 6.

I looked up and found a similar question : Lvalue required error

I understood the issue in that question.From the comments to the first answer to above mentioned question I see lvalue as something to which something can be stored.

But I still can't understand why &(a++) or &(++a) should give an error. Any help will be appreciated.

Thank You for reading this.

[Edit] Thank you for answering. If possible please include references where the exact sequence of execution or nature of such expressions are discussed. That way rookies like me won't trouble the community with such trivial questions.

回答1:

a++ increments your a and returns the old value of a. The & operator returns the address of a variable. But the returned old value of a doesn't have an address. It's a very temporary thing, not an lvalue. That's why you can not take the address of it.



回答2:

a++ and ++a and & all three of them needs lvalue to operate on and when operated they return the rvalue

So when you do &(a++)

First, (a++) is performed  -> a is taken as lvalue and (a++) returns rvalue

Second, &(a++) is performed -> a++ returns rvalue but & needs lvalue so lvalue is
missing,therefore an error.

For this similar reason you can't perform any of these:

++(a++) : lvalue missing
(++a)++ : lvalue missing
a++++   : lvalue missing
++++a   : lvalue missing


回答3:

a++, as you may know, returns a temporary with the value of a prior to incrementation. And you can't take the address of a temporary for the rather good reason that it'll die at the end of its expression (and thus before you manage to do anything with it).