[英]Initializing an array of doubles in C
如果我有一個static double arr[10];
精度數組,例如static double arr[10];
我想將數組中的所有值初始化為0
,我這樣做:
1 for (int i = 0; i < 10; i++)
2 arr[i] = 0;
我的問題:
第2行是否正確,還是我需要初始化為0.0
? 有什么不同?
您的第2行是正確的。 0
將隱式轉換為double
。
順便說一句,您已聲明arr
靜態,因此無論如何所有元素都將自動初始化為0
。 無需循環。
此外,如果要將非靜態數組的所有元素初始化為0
,則可以執行以下操作:
double arr[10] = { 0.0 };
是。 arr[i] = 0;
是正確的。 0
將隱式轉換為double
類型。
沒有static
存儲持續時間的未初始化變量。 零初始化的靜態數據存儲在BSS
部分中,而程序中未初始化的數據被初始化為0
,然后存儲在BSS
部分中。
因此,您無需顯式啟動靜態雙精度數組。
您的代碼arr[i] = 0
是正確的,因為int
會自動提升為double
。
但是我建議為了更好的可讀性,按如下所示初始化數組:
static double arr[10] = {0.0};
沒有顯式初始化程序的double 靜態數組將在程序啟動時自動初始化為全零。 (從技術上講,沒有顯式初始化程序的靜態任何事物都會在程序啟動時自動初始化為全零。)如果您需要再次將標量的靜態數組重新初始化為全零,或者需要對所有標量自動數組進行初始化-零,在使用它之前,您擁有的循環是正確的,但從技術上講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)
例如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;
^ ~~~~~~~
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.