1

C では、構造変数の値が同じ型であれば、その値を別の構造変数に割り当てることができます。それに従って、次のプログラムではs1=s2、両方がstruct同じ型の変数である場合に使用できます。s1={59,3.14}その後は使えないのですか?

文字列の場合、割り当て中に型に分解され、型の不一致エラーが発生する ため、初期化ステートメント以外"Test"の文字配列に文字列を割り当てることはできません。しかし、私のプログラムでは、どの文字にも分解されませんポインター、そうですか?特に初期化中に許可されているため、同じタイプであっても割り当てが許可されないのはなぜですか?一方が割り当て可能で他方が割り当て可能であるとの違いは何ですか?ではありません?arr"Test"char*{59,3.14}s1s2{59,3.14}s1

#include<stdio.h>

int main(void)
{
    struct test1
    {
        int a;
        float b;
    } s1= {25,3.5},s2= {38,9.25};

    printf("%d,%f\n",s1.a,s1.b);

    s1=s2;   // Successful
    printf("%d,%f\n",s1.a,s1.b);

    s1= {59,3.14}; //ERROR:expected expression before '{' token|
    printf("%d,%f\n",s1.a,s1.b);

}
4

2 に答える 2

2

このようにキャストする必要があります:s1 = (struct test1){59, 3.14};構造体 test1 型の {...} を考慮する必要があることをコンパイラに知らせるためです。

別の言い方をすれば、括弧内に集められたデータには型がないため、キャストを使用して型を指定する必要があります。

編集:

コンパイラは、各構造体のフィールドの予想される型を知る必要があります。これは、パディングなどのために、各引数の正しいバイト数を知るために必要です。それ以外の場合は、1 バイトに収まる値であるため、値 59 (int を意味する) を char としてコピーすることもできます。

于 2013-05-17T16:42:14.093 に答える