計算機科学のブログ

C - 構造体、共用体、ビットフィールド - 独自の構造を使う - union, 指示付き初期化子

Head First C ―頭とからだで覚えるCの基本David Griffiths(著)、 Dawn Griffiths(著)、 中田 秀基(監修)、 木下 哲也(翻訳)、 O’Reilly Media)の5章(構造体、共用体、ビットフィールド - 独自の構造を使う - 分割して構築する)、p.250(混乱したミキサー)の解答を求めてみる。

Makefile

all: main.c
	cc main.c && ./a.out

コード

main.c

#include <stdio.h>
typedef union
{
    float lemon;
    int lime_pieces;
} lemon_lime;

typedef struct
{
    float tequila;
    float cointreau;
    lemon_lime citrus;
} margarita;

int main()
{
    margarita m1 = {
        2.0,
        1.0,
        .citrus = 2};
    printf("%2.1f単位のテキーラ\n%2.1f単位のコアントロー\n%2.1f単位のジュース\n\n",
           m1.tequila, m1.cointreau, m1.citrus.lemon);
    margarita m2 = {
        2.0,
        1.0,
        {0.5}};
    printf("%2.1f単位のテキーラ\n%2.1f単位のコアントロー\n%2.1f単位のジュース\n\n",
           m2.tequila, m2.cointreau, m2.citrus.lemon);
    margarita m3 = {
        2.0,
        1.0,
        {.lime_pieces = 1}};
    printf("%2.1f単位のテキーラ\n%2.1f単位のコアントロー\n%i切れのライム\n\n",
           m3.tequila, m3.cointreau, m3.citrus.lime_pieces);
}

入出力結果(Terminal, Zsh)

% make
cc main.c && ./a.out
2.0単位のテキーラ
1.0単位のコアントロー
2.0単位のジュース

2.0単位のテキーラ
1.0単位のコアントロー
0.5単位のジュース

2.0単位のテキーラ
1.0単位のコアントロー
1切れのライム

%