关于错误的困惑:要求左值作为一元'&'操作数

时间:2019-06-24 08:54:14

标签: c rvalue lvalue pre-increment

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

#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。

2 个答案:

答案 0 :(得分:10)

onCleared的结果是新值,而不是变量,因此您要尝试获取未实际存储在任何地方的地址。那是外行的解释。

答案 1 :(得分:6)

相对于前缀递增运算符++,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;

}