This question already has answers here:
Not able to understand error condition wrt lvalues

(3个答案)


1年前关闭。




我一直在尝试通过编写简单的代码来理解指针的概念,
我遇到了一个错误问题,似乎我无法解决或理解它。
#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()'返回一个指向int的指针,并且main应该是
使用*运算符打印返回的int。对于foo()中的静态num,我认为通过放置静态限定符,num不再是临时变量,因此'&'可用于num。

最佳答案

在C和C++之间,相对于前缀增量运算符++有所不同。

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

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

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

因此,在C中,您可能不会例如编写

++++++x;

而在C++中,此表达式
++++++x;

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

为了使函数在C中正确无误,您必须将应用的运算符分开,例如
int *foo(void) {
    static int num = 1;
    ++num;
    //return &(++num);
    ++num;
    return &num;

}

关于关于错误: lvalue required as unary '&' operand的困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56733030/

10-11 22:46
查看更多