This question already has an answer here:
I have been trying to understand pointer concepts by writing simple code, and I got an error problem, and it seems like I couldn't solve it or understand it.
#include <stdio.h>
int *foo(void);
int main(void) {
printf("%d\n", *foo());
return 0;
}
int *foo(void) {
static int num = 1;
++num;
return &(++num);
}
Here is the error message.
error: lvalue required as unary ‘&’ operand
return &(++num);
Function 'foo()' returns a pointer to int, and main is supposed to be print the returned int by using * operator. For static num within foo(), I thought that by putting static qualifier, num is not temporary variable anymore, so '&' can be used to num.
There is a difference between C and C++ relative to the prefix increment operator ++
.
In C the result is the new value of the operand after incrementation. So in this expression &(++num)
there is an atttempt to get the address of a temporary object (rvalue).
In C++ the program will be correct because in C++ the result is the updated operand; it is an lvalue.
That is in C the result is a new value while in C++ the result is the updated operand.
So in C you may not for example write
++++++x;
while in C++ this expression
++++++x;
is correct and you may apply the unary operator &
to the expression like
&++++++x;
To make the function correct in C you have to separate the applied operators like
int *foo(void) {
static int num = 1;
++num;
//return &(++num);
++num;
return #
}
The result of ++num
is the new value, not the variable, so you're trying to take the address of something that is not actually stored anywhere. That's the layman's explanation.
来源:https://stackoverflow.com/questions/56733030/confusion-about-an-error-lvalue-required-as-unary-operand