can';我不能在数组中使用double吗?

can';我不能在数组中使用double吗?,c,C,这里有什么问题? 它显示了一个bug,帮帮我,我是初学者。 我可以在数组中使用双精度吗 #include <stdio.h> int main() { double a; scanf("%lf",&a); double s[a]; double b,c=0, d; for(b=0;b<a;b++){ scanf("%lf",&s[b]); } for(b=0;b<a;b

这里有什么问题? 它显示了一个bug,帮帮我,我是初学者。 我可以在数组中使用双精度吗

    #include <stdio.h>
    int main()
    {
    double a;
    scanf("%lf",&a);
    double s[a];
    double b,c=0, d;
    for(b=0;b<a;b++){
    scanf("%lf",&s[b]);
    }
    for(b=0;b<a;b++){
    c = c + s[b];
    d=b+1;
    printf("%lf\n",c/d);
    }
    return 0;
    }
#包括
int main()
{
双a;
scanf(“%lf”、&a);
双s[a];
双b,c=0,d;

对于(b=0;b,虽然现代C语言支持可变长度数组,但数组的大小必须是正整数

相反,您可以将其四舍五入到最接近的
大小\u t

size_t ASIZE = ceil(fabs(a));
double s[ASIZE];
包括
以访问
ceil
fabs

使用以下方法:

int a;
scanf("%d",&a);

剩下的代码就可以了。

如果不清楚,数组不能是双倍长度。这是未定义的行为

这是因为double不是整数,而是可以是整数的有理数。理解这个问题的一个简单方法是取一些浮点值,比如3.5

什么是长度为3.5的数组在连续内存中是否有3个半插槽?是否有足够的插槽容纳3个?4个?3.5个插槽可能是无用的和非故意的,如果它不是分数插槽,则可能不清楚,也可能是非故意的,因此行为未定义

虽然其他人提出了创建整数类型的解决方案,但您不能创建双倍长度的数组

double arr[5];
但是你不能像这样创建一个双倍长度的数组

int arr[3.3];

不能使用浮点类型(
float
double
)指定数组大小或数组索引:

6.7.6.2阵列声明器 约束

1除了可选的类型限定符和关键字
static
[
]
可以定义 表达式或
*
如果它们限定表达式(指定数组大小),则 表达式应具有整数类型。如果表达式是常量表达式,则应 具有大于零的值。元素类型不得为不完整或函数 类型。可选类型限定符和关键字
static
应仅在 声明具有数组类型的函数参数,然后仅在最外层 数组类型派生。

6.5.2.1阵列订阅 约束

1其中一个表达式的类型应为“指向完整对象类型的指针”,另一个表达式的类型为 表达式应为整数类型,结果的类型为“type”。 同上

因此
a
b
必须是整数类型-我通常使用
size\u t
作为数组大小和索引变量:

size_t a;

printf( "Gimme the array size: " );
scanf( "%zu", &a );

double s[a];

for ( size_t b = 0; b < a; b++ )
  scanf( "%lf", &s[b] );
size\u t a;
printf(“给我数组大小:”);
scanf(“%zu”、&a);
双s[a];
对于(大小b=0;b
由于明显的原因,数组的大小不能是非整数。详细阐述Eugene的评论,最简单/最简单的解决方法是:
int a;scanf(“%d”,&a)
不喜欢将其变为用户提供的带符号的
int
,因为这可能是否定的。同样的老问题。当您使用索引访问元素时,您需要使用整数。但您已将变量“b”声明为双精度,这必须是整数。Govid先生说得好。我们可以为此创建自己的函数。我已编辑过前面的代码和为此添加的函数。你可以,但可能会有问题-我不明白,如果可以,请简化…谢谢你浮点数具有有限精度,比较可能无法按预期运行,但好吧,它的定义很好,你可以对它们进行比较。我觉得有点奇怪,该标准没有被修改ECL是表达式中给定的数组大小,对负整数值的求值是未定义的行为。这绝对是要避免的。@GovindParmar:如果数组大小是常量表达式,则负值是违反约束的,需要进行诊断。如果它不是常量表达式,且为负值,则它是indeed未定义的行为(见6.7.6.2/5)。