4

私はK&RCを学んでいます。6.8章では次のように述べています。

ユニオンは、最初のメンバーのタイプの値でのみ初期化できます。したがってu、上記の和集合は整数値でのみ初期化できます。

...そしてユニオンuを次のように定義します。

union u_tag {
  int ival;
  float fval;
  char *sval;
} u;

私はこれを理解する方法がわかりません。これはどういう意味ですか、の初期化は次のようにするu必要があります。

u.ival = 323;

明らかに、そうではありません。なぜなら、私は次のように初期化できるからですu

u.fval = 1.0;

また

u.sval = "hi";

リッチーとはどういう意味ですか?

4

1 に答える 1

8

投稿されたコードは、初期化ではなく代入を実行しています。323著者は、 が でintあり、 の最初のメンバーが であるため、以下が有効な初期化であることを意味していましu_tagint

union u_tag u = { 323 }; /* Initializes u.ival. */

を で初期化しようとするため、以下は無効intですchar[]

union u_tag u = { "hi" };

ただし、C99 以降、これは当てはまりません。C99 では、指示子が導入されました。

union u_tag u = { .sval = "hi" };

unionC89 では、最初のメンバー以外のメンバーを対象とした値でを初期化したい場合は、既存の をコピーできましたunionunionこれは、 asを宣言したい場合に特に便利ですconst。例えば:

union u_tag make_u_tag_with_fval(const float a_fval)
{
    union u_tag u;
    u.fval = a_fval;
    return u;
}

const union u_tag u_fval = make_u_tag_with_fval(1.0);
于 2012-12-12T14:41:16.963 に答える