在C中初始化一个双精度数组

时间:2015-03-08 15:07:32

标签: c

如果我有一系列双打,例如static double arr[10];,并且我想将数组中的所有值初始化为0,我会这样做:

1 for (int i = 0; i < 10; i++)
2    arr[i] = 0;

我的问题:

第2行是否正确,还是需要初始化为0.0?有什么区别?

4 个答案:

答案 0 :(得分:4)

你的第2行是正确的。 0将隐式转换为double

顺便说一句,您已声明arr静态,因此无论如何所有元素都会自动初始化为0。不需要循环。

此外,如果要将非静态数组的所有元素初始化为0,您可以这样做:

double arr[10] = { 0.0 };

答案 1 :(得分:3)

是。 arr[i] = 0;是正确的。 0将隐式转换为double类型。

答案 2 :(得分:2)

没有未初始化的变量static存储持续时间。零初始化静态数据存储在BSS部分,程序中未初始化的数据初始化为0,然后存储在BSS部分。

因此,您无需明确发起静态双打数组。

您的arr[i] = 0代码是正确的,因为int会自动提升为double

但我建议为了更好的可读性,你按如下方式初始化数组:

static double arr[10] = {0.0};

答案 3 :(得分:0)

没有显式初始化程序的 static 双精度数组将在程序启动时自动初始化为全零。 (从技术上讲,没有显式初始化程序的静态任何会在程序启动时自动初始化为全零。)如果需要将静态数组的标量重新初始化为全零,或者需要初始化在使用它之前,自动标量数组为全零,你拥有的循环是正确的,但技术上int应该是size_t

for (size_t i = 0; i < n_elements; i++)
    arr[i] = 0;

在C中,无论arr的元素类型是什么,此构造都可以工作;没有标量类型无法赋予整数常量0。 (如果你有一个聚合数组,你必须做更冗长的事情。)另外考虑

memset(arr, 0, n_elements * sizeof(element_type));

也适用于聚合数组。从技术上讲,不需要将所有标量类型设置为适当的零值,但实际上在您可能遇到的所有系统上都会这样做。

如果您对它们执行其他操作,则整数常量0和浮点常量0.0之间的差异变为可见:例如

int    a = 0;    // ok (no conversion)
double b = 0;    // ok (implicit conversion to double)
char*  c = 0;    // ok (implicit conversion to char* null pointer)

int    d = 0.0;  // ok (implicit conversion to int, does not change value)
double e = 0.0;  // ok (no conversion)
char*  f = 0.0;  // error! cannot initialize pointer var with fp constant

int    g = 3.14159; // dubious: value truncated to 3
double h = 3.14159; // ok
char*  i = 3.14159; // error (same as above)
例如,clang 3.5说:

test.c:7:7: error: initializing 'char *' with an expression of incompatible type
      'double'
char* f = 0.0;
      ^   ~~~
test.c:9:11: warning: implicit conversion from 'double' to 'int' changes value
      from 3.14159 to 3 [-Wliteral-conversion]
int   g = 3.14159;
      ~   ^~~~~~~
test.c:11:7: error: initializing 'char *' with an expression of incompatible
      type 'double'
char* i = 3.14159;
      ^   ~~~~~~~