union
共用体ほか

10章

10.8

共用体の各メンバは同一の記憶領域を共有する.同時には 1 つのメンバしか保持できない. メモリ領域を節約できる.

共用体宣言の中で初期化するときは最初のメンバの型でしか初期化できない.

メンバが複数定義されていても同時に 1 つのメンバしか使うことができない.現在 どのメンバを使用しているのかをプログラマが把握していなくてはならない.

10.9

ビット演算子は整数オペランドの内容をビットごとに操作するときに使われる.

ビット操作機能はマシン依存であることに注意せよ.

リスト 10.5 は符号なし整数を 2 進数表現でプリントする関数 displayBits を使ったプログラムである.入力し,実行せよ.

(65000)10 という値は,unsigned 型ではメモリ内で (00000000 00000000 11111101 11101000)2 で表現されている. (1)10 は  (00000000 00000000 00000000 00000001)2 で表現され,これを 15 ビット左シフトすると (00000000 00000000 10000000 00000000)2 となり,この値で displayMask は初期化される.

for ループの一回目の value & displayMask の演算は
(00000000 00000000 11111101 11101000)2
&
(00000000 00000000 10000000 00000000)2
となり,下位から 16 ビットめが 1 のとき,かつそのときのみ真となる. つまり, 16 ビットめが検査位置となる. 次のループ時には value の値が 1 ビット左にシフトされているので
(0000000 000000001 11111011 11010000)2となる.これと displayMask
(00000000 00000000 10000000 00000000)2
の & を 取るので value の値で前回検査したビットの右のビットが検査位置に現れ, これが 1 のとき,かつそのときのみ真となる. これを value でもともと最小だったビットが検査位置である 16 ビットめに来るまで 行う.これにより関数 displayBits は引数を 2 進数表現したときの 16 ビット めから最下位ビットまでを順に出力することで 2 進数表現を出力している.

リスト 10.5 を 32 ビットで表示するものに変更せよ.

10.10

ビットフィールドを使って int の全てのビット数が必要ないデータを まとめて詰め込んで記憶することができ,メモリを節約できる.例えばカードの数字は 4 ビット,スートは 2 ビット,色は 1 ビットで表現できるので合わせて 7 ビットで 記憶できる.

10.11

列挙体を用いて多くの定数宣言をまとめて行うことができる. 列挙定数により一連の識別子に整数を対応させる. これにより識別子を整数が書ける場所に書く事ができる.

列挙体で宣言された型の変数は値として整数値をもつ. 例えばリスト 10.11 の month は 1, 2, ... 12 の値が利用できる.それぞれ の数値の代わりに JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC を定数として利用できる.

11章

11.1

変数などのデータを永久に保存するためにはファイルに記録する. Cプログラムでデータファイルを生成,更新,処理する方法を説明する.

11.2

Cではビットを最下位してデータの階層がある.例えば いくつかのビットから文字コードが構成される. これを文字とすると,いくつかの文字から文字列が作られる. これをフィールドとする.いくつかのフィールドから構造体が 構成される.これをレコードと呼ぶ. いくつかのレコードから構成されたものがファイルである.

ファイルから目的のレコードにアクセスするためには 重複しないレコードをもつ必要がある. これをレコードキーとよぶ.

レコードキーの順番にレコードを格納する実装をシーケンシャルアクセスファイル という.

関連したファイルの集まりをデータベース管理システム(DBMS)とよぶ.

11.3

C ではファイルをシーケンシャルなバイトストリームとみなす.最後には EOF マーカが 置かれる.

プログラムが実行されると標準入力,標準出力,標準エラーの 3 つのストリームが 得られる.

ファイルをオープンされるとファイル構造体へのポインタが返される. ファイル記述子にはファイルを管理する情報が書かれているが, プログラマが直接ファイル記述子の内容に触れる必要はない.

FILE 型へのポインタ stdin, stdout, stderr を使ってそれぞれ 標準入力,標準出力,標準エラーを操作できる.

getchar は標準入力から文字を読み込む関数であるが, fgetc は指定したファイルから文字を読み込む関数である.ファイルは 第一引数として FILE 型へのポインタを渡すことで指定する.同様に putchar, gets, puts, scanf, printf のファイル指定版 fputc, fgets, fputs, fscanf, fprintf が用意されている.

11.4

Cではレコードの概念が提供されない.プログラマがファイルを構成する必要がある. リスト 11.1 を入力し,実行せよ.Windows では ctrl-z と改行キーで 入力ファイル終了を OS に指示する.


Updated in December 3, 2007, schedule, Yamamoto Hiroshi