[英]Why Can't We Initialize A Structure Multiple Times in C?
為什么這在C中是非法的? 將p重新初始化為不同的位置有什么問題? 通過單獨更改字段值可以實現相同的效果,因此我不明白為什么不能在p = {1,2}的一個步驟中完成。
struct posn {
int x;
int y;
};
int main() {
struct posn p = {3, 4};
p = {1, 2}; //Causes error
// must do p.x = 1; p.y = 2;
return 0;
}
這就是語言的指定方式。
為了與C的一般設計保持一致,為了允許p = {1, 2}
, {1, 2}
必須是一個表達式。 但是什么類型的? 它可以是int[2]
,或struct { int a; short s; }
struct { int a; short s; }
struct { int a; short s; }
,還是有很多其他的事情。
使用C99,可以使用復合文字,它明確地提到了類型(從而解決了如何確定類型的問題),括號內的類型名稱后跟{}
括號中的初始化程序:
p = (struct posn){1, 2};
您可以使用復合文字。 例如
#include <stdio.h>
struct posn
{
int x;
int y;
};
int main(void)
{
struct posn p = { 3, 4 };
p = ( struct posn ){ 1, 2 };
printf( "p.x = %d, p.y = %d\n", p.x, p.y );
return 0;
}
程序輸出是
p.x = 1, p.y = 2
這有效,因為與數組相對的結構具有復制賦值運算符。 但是,您可以在結構中包含一個數組,並使用相同的技巧重新分配數組。
這是一個例子
#include <stdio.h>
struct posn
{
int a[2];
};
int main(void)
{
struct posn p = { { 3, 4 } };
p = ( struct posn ){ { 1, 2 } };
printf( "p.a[0] = %d, p.a[1] = %d\n", p.a[0], p.a[1] );
return 0;
}
因此它看起來像C ++中的std::array
。:)
這不完全正確,你不能使用初始化列表,但你可以隨時初始化或更精確地更改結構的成員,試試這個
p.x = 1;
p.y = 2;
初始化列表只能是聲明的一部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.