错误:需要左值作为一元‘&’操作数

问题描述 投票:0回答:4
 error: lvalue required as unary ‘&’ operand
   34 |         scanf("%lf\n", &prompt_for_parking());

我有一个原型:

double prompt_for_parking(void);

我该如何调试这个?我试图让用户在

double
中输入一个值并将其存储到
prompt_for_parking
中。

c
4个回答
1
投票

prompt_for_parking
被声明为 函数

存储在变量中:

// double prompt_for_parking(void);
double prompt_for_parking;

// scanf("%lf\n", &prompt_for_parking());
scanf("%lf\n", &prompt_for_parking);

提示:检查

scanf()
的返回值。 是1吗?

提示:最好删除尾随空格。

// scanf("%lf\n", ...
scanf("%lf", ...

0
投票

您的

prompt_for_parking
被声明为 函数,不带输入参数并返回 临时
double
值。不允许获取临时地址,因此会出现编译器错误。无论如何,在这种情况下这样做也是没有意义的。

%lf
说明符需要一个指向
double
变量的指针,例如:

double prompt_for_parking;
scanf("%lf\n", &prompt_for_parking);

0
投票

如果函数可以访问自身外部的内存空间(静态变量或在堆上分配),我们可以模拟向函数赋值。

#include <stdio.h>

double* fct(void)
{
    static double s_double;
    return &s_double;
}

int main(void)
{
    scanf("%lf", fct());
    printf("%f\n", *fct());

    return 0;
}

我不确定这就是你想要做的。


0
投票

您试图将某些内容存储在函数返回值的地址内,而不是将其作为输入传递给函数。

解释错误消息乱码的含义:

  • 一元
    &
    指的是地址运算符,它是一个一元运算符,因为它只有一个操作数(右侧)。还有按位 AND 运算符
    &
    ,符号相同但有两个操作数,因此其中一个是 二元运算符。编译器消息显示一元来区分这两者。
  • lvalue 表示可以对数据进行读/写访问的可寻址内存位置。该术语源自“= 运算符的左值”,因为赋值运算符的左操作数是存储某些内容的位置,但多年来已获得更广泛的含义。反之亦然:rvalue(“正确值”)将是您无法寻址或写入的内容。

从这里开始,我们可能会注意到寻址运算符需要一个可寻址的内存位置,即左值。 (类似地,相关的间接运算符

*
将产生左值。)

当您有像

int f (void)
这样的函数时,该函数会将结果存储在临时的、未命名的内存位置中。它可以是 CPU 寄存器或堆栈上的位置 - 由编译器决定。不过,CPU 寄存器没有地址,因此可能正是出于这个原因,C 语言被设计为无法从函数中获取返回值的地址 - 它不是左值,而是右值。

类似地,如果我们执行类似

a + b
的操作,结果也会存储在我们无法写入或获取地址的临时位置中。
&(a + b)
给出了与您类似的错误:“无法获取右值的地址”。


如何解决:

我希望有一个名为

prompt_for_parking
的函数来提示用户,因此将
scanf
移动到该函数中似乎是正确的设计。无论
scanf
位于何处,您都必须将结果存储在命名变量中。在本例中属于
double
类型,因为您使用
%lf

一种替代方案是将函数设计为

void some_function (double x);
- 采用
double
参数但不返回任何值。然后:

double tmp;
scanf("%lf", &tmp);
some_function(tmp);

现在如何在实际程序中执行此操作当然取决于该程序应该执行的操作。

© www.soinside.com 2019 - 2024. All rights reserved.