'long' 之前的预期表达式

expected expression before 'long'

我对编程非常陌生,我正在使用一本书来帮助我编写一些代码,这些代码将在用户输入 "x" 后求解 ln(1+x)。我的语法与书中示例中的语法完全相同,但我一直在第 28 行收到 error: expected expression before 'long'。第 28 行是读取 long double y = LOG(1+(x));.

的行
#include <stdio.h>
#include <math.h>
#define LOG(X) _Generic((X),\
  long double: log(1+(x))\
)

int main()
{

   double x;

   printf("Please enter a number from -1 to +1: ");
   scanf("%f", &x);

   long double y = LOG(1+(x));

   printf("From C math library: ln(1+x) = %f\n", y);

}

首先,您的通用宏是为 long double 类型编写的。您提供了一个 double 参数 xlong doubledouble 是两种不同的类型。您没有为 double 定义通用分支,这意味着您的宏不会针对 double 参数进行编译。将 x 的类型更改为 long double 或使您的通用宏支持 double 个参数。

此外,这是一种非常奇怪的写 LOG 宏的方法。为什么要在宏中明确使用 1 + (x) 作为 log 参数?如果明天您想要计算 LOG(2 + y) 怎么办?您的宏仍然会坚持计算 log(1 + (x)),这根本没有任何意义。更明智的做法是将 X 传递给 log

#define LOG(X) _Generic((X),\
  long double: log(X)\
)

其次,为了scanf一个double值你需要%lf格式说明符。 %f 用于 float。要 printf 一个 long double 值,你需要 %Lf 格式。

如果您是编程新手,并试图使示例起作用,那么在这个阶段我不会使用宏,而是专注于函数和数据类型。从 double 开始,这是由 math.h 接口的库的典型工作类型。我的示例展示了如何使用 log() 函数计算自然 ln。

正如其他人评论的那样,scanf() 需要 double 的格式说明符 %lf,但是 printf() 只需要 %f 的格式说明符对于 double。请注意,我已经测试了来自 scanf() 函数 的 return 值以及 您输入的数字,以检查输入是否正常。

最后,您邀请的号码在 -1 <= x <= 1 范围内,但 ln(0) 未定义,因此我限制了输入范围以排除 -1.

#include <stdio.h>
#include <math.h>

int main(void)
{
    double x = 0, y;
    printf("Please enter a number from -1 to +1: ");
    if (1 != scanf("%lf", &x) || x <= -1 || x > 1) {
        printf("I need -1 < number <= +1\n");
        return 1;
    }
    y = log(x + 1);
    printf("From C math library: ln(1+x) = %f\n", y);
    return 0;
}

以下是一些示例输出:

Please enter a number from -1 to +1: -1
I need -1 < number <= +1

Please enter a number from -1 to +1: 0
From C math library: ln(1+x) = 0.000000

Please enter a number from -1 to +1: 1
From C math library: ln(1+x) = 0.693147