簡體   English   中英

為什么我們不能在C中多次初始化結構?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM