Confusion about an error: lvalue required as unary '&' operand

Confusion about an error: lvalue required as unary '&' operand

我一直在尝试通过编写简单的代码来理解指针的概念, 我遇到了一个错误问题,我似乎无法解决或理解它。

#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);

}

这是错误信息。

error: lvalue required as unary ‘&’ operand
  return &(++num);

函数'foo()'returns一个指向int的指针,main应该是 使用 * 运算符打印返回的 int。对于 foo() 中的 static num,我认为通过放置 static 限定符,num 不再是临时变量,所以 '&' 可以用于 num。

++num 的结果是新值,而不是变量,因此您要获取的地址实际上并未存储在任何地方。这是外行人的解释。

C和C++相对于前缀自增运算符有区别++

在 C 中,结果是递增后操作数的新值。所以在这个表达式中 &(++num) 尝试获取临时对象(右值)的地址。

在 C++ 中,程序将是正确的,因为在 C++ 中,结果是更新后的操作数;它是一个左值。

即在 C 中,结果是一个新值,而在 C++ 中,结果是更新后的操作数。

所以在 C 中你可能不会写

++++++x;

而在 C++ 中这个表达式

++++++x;

是正确的,您可以将一元运算符 & 应用于表达式

&++++++x;

要使 C 中的函数正确,您必须像

那样分隔应用的运算符
int *foo(void) {
    static int num = 1;
    ++num;
    //return &(++num);
    ++num;
    return &num;

}