一个错误的困惑:需要lvalue作为一元'&'操作数

5

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

#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()' 返回一个指向整数的指针,并且main函数应该使用*运算符来打印返回的整数。对于foo()内的静态变量num,我认为通过添加静态限定符,num不再是临时变量,所以可以使用“&”符号对其进行操作。


1
同样的问题:无法理解关于lvalues的错误条件 - Sander De Dycker
为了解决问题,您可以将该行更改为++num; return&num; - M.M
2个回答

11
< p > ++num 的结果是新值,而不是变量本身,因此您正在尝试获取实际上未存储在任何地方的内容的地址。这就是通俗易懂的解释。


7

C和C++关于前缀递增运算符++有所不同。

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

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

也就是说,在C中,结果是新值,而在C++中,结果是更新后的操作数。

因此,在C中,您可能不能编写下面的代码:

++++++x;

在C++中,这个表达式
++++++x;

这是正确的,你可以对表达式应用一元运算符&,如下所示:

&++++++x;

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

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接