'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
参数 x
。 long double
和 double
是两种不同的类型。您没有为 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
我对编程非常陌生,我正在使用一本书来帮助我编写一些代码,这些代码将在用户输入 "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
参数 x
。 long double
和 double
是两种不同的类型。您没有为 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