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

vcudknz3  于 2021-07-09  发布在  Java
关注(0)|答案(4)|浏览(401)

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


# 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;
    }
f4t66c6m

f4t66c6m1#

使用此选项:

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

其余的代码都很好。

y0u0uwnf

y0u0uwnf2#

虽然现代c语言支持可变长度数组,但数组的大小必须是正整数。
你所能做的是绕到最近的地方 size_t :

size_t ASIZE = ceil(fabs(a));
double s[ASIZE];

包括 <math.h> 访问 ceil 以及 fabs .

ecbunoof

ecbunoof3#

如果不清楚,数组的长度不能是原来的两倍。这是未定义的行为。
这是因为double不是整数,而是可以是整数的有理数。理解这个问题的一个简单方法是使用一些浮点值,比如3.5。
长度为3.5的数组是什么?它是连续内存中某个大小的3个半插槽吗?有足够的空位容纳3个人吗?4? 3.5插槽可能是无用的和意外的,如果它不是一个分数插槽,它可能是不清楚的,可能是意外的,因此没有定义的行为。
虽然其他人提出了创建整数类型的解决方案,但不能创建双倍长度的数组。你可以创建一个双倍数组

double arr[5];

但是你不能像这样创建一个双倍长度的数组

int arr[3.3];
2j4z5cfb

2j4z5cfb4#

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

6.7.6.2数组声明器

约束条件
1除了可选的类型限定符和关键字 static ,的 [ 以及 ] 可以限定一个表达式或 * . 如果它们限定一个表达式(指定数组的大小),则该表达式应为整数类型。如果表达式是常量表达式,则其值应大于零。元素类型不得为不完整或函数类型。可选的类型限定符和关键字 static 应仅出现在具有数组类型的函数参数的声明中,然后仅出现在最外层的数组类型派生中。
c 2011在线草案

6.5.2.1阵列下标

约束条件
1其中一个表达式的类型应为“指向完整对象的指针类型”,另一个表达式的类型应为整数类型,结果的类型应为“类型”。
同上。
所以呢 a 以及 b 必须是积分型-我通常使用 size_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] );

相关问题