如果我有一系列双打,例如static double arr[10];
,并且我想将数组中的所有值初始化为0
,我会这样做:
1 for (int i = 0; i < 10; i++)
2 arr[i] = 0;
我的问题:
第2行是否正确,还是需要初始化为0.0
?有什么区别?
答案 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;
^ ~~~~~~~