【问题标题】:cannot take the address of an rvalue of type 'float'不能获取“float”类型的右值的地址
【发布时间】:2017-10-27 12:41:09
【问题描述】:

所以我是编码新手,并尝试用 C 语言编写程序,我在其中输入一个浮点值,它返回表示该值所需的最小硬币数。但我不断收到此错误消息:

c:16:19: 错误:无法获取类型为“float”的右值的地址

printf("%f", &change(f));

#include <stdio.h>
#include <cs50.h>

float change(float n);

int main(void) {
    float f;
    do {
        f = get_float();
    } while (f < 0);

    change(f);
    printf("%f", &change(f));
}

float change(float n) {
    float pennies = 0.01;
    float nickles = 0.05;
    float dimes = 0.1;
    float quarters = 0.25;
    float coins = 0;

    do {
        n = n - quarters;
        coins++;
    } while (n >= quarters);

    do {
        n = n - dimes;
        coins++;
    } while (n >= dimes);

    do {
        n = n - nickles;
        coins++;
    } while (n >= nickles);

    do {
        n = n - pennies;
        coins++;
    } while (n != 0);

    return coins;
}

【问题讨论】:

  • 为什么你甚至想要在那个例子中传递指针?您的 printf 函数不期望那里有一个指针。
  • 我投票决定关闭它,因为它是由一个简单的印刷错误引起的,或者只是对该语言的基础研究还远远不够,这两者都没有为未来的读者创造一个有用的线索。
  • printf ("%f", &amp;change(f)); 尝试将change() 返回的值的地址打印为浮点数(因为它是右值,所以不能)。您只想打印函数结果的值:printf ("%f", change(f)); 这使得之前对change(f); 的调用变得不必要了。
  • 欢迎来到本站!查看tourhow-to-ask page 了解更多关于提出问题以吸引高质量答案的信息。如果评论者询问,您也可以edit your question 提供更多信息。我同意@JohnnyMopp。
  • 旁白:请阅读Why not use Double or Float to represent currency? 虽然这是一个 java 问题,但公认的答案是 这个问题不仅适用于 Java,它适用于任何使用本机浮点类型的编程语言.

标签: c pointers cs50


【解决方案1】:

我对 C 语言生疏了,但我认为正在发生的事情。有左值和右值。

int a = 5;

在这一行中,a 是左值,5 是右值。您只能获取左值的地址而不是右值。 当您调用change(f) 时,您会为自己获得一个右值,然后您可以将其分配给左值,例如

float ff = change(f);

现在您可以获取ff的地址。 所以要么尝试按照@mco 的建议去做(如果你想打印一个实际值),或者如果你真的想要地址做这样的事情

float ff = change(f);
printf("%i", &ff);

我将%f 更改为%i,因为将地址打印为浮点数毫无意义。

【讨论】:

  • %i 不适合打印指针,因为它可能会溢出或以其他方式调用 UB。那应该是%p。但很明显,打印float 的地址并不是 OP 想要的。
【解决方案2】:

格式%f 接受浮点数参数,因此您可以将change(f) 返回的数字作为第二个参数传递给printf

printf ("%f", change(f));

表达式的临时结果,如change(f),是右值,它们没有&amp;可以访问的内存位置

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 2014-10-15
    相关资源
    最近更新 更多