C言語のキーワード詳解
本記事では、
C言語の核となるキーワードに焦点を当て、その詳細を解説します。
C言語のキーワードは、ISO/IEC 9899規格に準拠しており、言語の進化とともにその数と機能は変化してきました。本稿はキーワードに絞った解説であり、
C言語全体の構造や、キーワード以外の要素については扱いません。読者の理解を助けるため、適宜他のプログラミング言語との比較も行います。なお、初期の
C言語の教科書である『The C Programming Language』(K&R)初版にはキーワードの記載がありませんでしたが、第2版では付録にキーワードが掲載されています。
C言語キーワードの特徴
C言語のキーワード数は、規格の改定ごとに変化してきました。
K&R第2版 (1988): 32個
C89/C90: 32個
C99: 37個 (_Bool, _Complex, _Imaginary, inline, restrict が追加)
C11: 44個 (_Alignas, _Alignof, _Atomic, _Generic, _Noreturn, _Static_assert, _Thread_local が追加)
基本型、分岐(if, switch)、反復(for, while)などの基本的な語は、
C++でもほぼそのまま取り入れられています。
型に関するキーワード
C++と共通の語が多く使用されていますが、
C99で導入された `_Bool`, `_Complex`, `_Imaginary`, `restrict` は、
C++03以降の規格でもキーワードとなっていません。
`_Bool`, `char`, `short`, `int`, `long` があります。
C99以降では、`long long` とすることで
64ビット以上の幅を持つ
整数型を表現できます。`_Bool` 型は
整数型の一種であり、`true` や `false` はキーワードではなく、`stdbool.h` で定義されるマクロです。
符号の有無
`signed`, `unsigned` を使い、
整数型の符号の有無を指定します。
浮動小数点型
`float`, `double` があります。`double` は `long double` 型を表現する際にも使用されます。
`_Complex`, `_Imaginary` が
C99で標準化されました。`_Imaginary` は厳密には虚数型であり、すべての処理系でサポートされるわけではありません。これらは浮動小数点型と組み合わせて精度を指定します。
c
float _Complex c;
double _Imaginary i;
`struct`, `union`, `enum` は、タグ名を伴ってユーザー定義の型を定義する際に使用します。
c
struct example_struct { int a; };
union example_union { int a; float b; };
enum example_enum { A, B, C };
型修飾子
`volatile`, `const`, `restrict` があります。
`volatile` はコンパイラの最適化を抑止します。
`const` はオブジェクトが書き換えられないことを示します。
`restrict` はオブジェクトへのアクセスがポインタ経由でのみ行われることを示します (
C99で標準化)。
記憶クラス指定子
`auto`, `extern`, `static`, `register` があります。
`auto` は自動記憶域期間を指定し、ブロックスコープ内のオブジェクトにのみ使用できます。現在は省略されることが一般的です。
C++では意味が異なります。
`extern` は静的記憶域期間と外部リンケージを指定し、他のモジュールで定義された名前を参照する際に使用します。
`static` は静的記憶域期間と内部リンケージを指定します。ファイルスコープとブロックスコープで意味が異なります。
`register` は変数の記憶領域を
CPUのレジスタに割り当てることを推奨します。
typedef
`typedef` は型に別名を付けます。構文上は記憶クラス指定子に分類されますが、記憶クラスとは直接関係ありません。
その他の型
`void` は、引数または返却値のない関数の宣言や定義、または特定の型を指さないポインタ型に使用します。
c
void function(void);
void p;
制御構造
制御に関する語も
C++とほぼ共通ですが、Cには例外処理に関する語 (`try`, `catch`, `throw` など) は存在しません。
選択文
`if`, `else`, `switch`, `case`, `default` は、条件分岐を実現する選択文に使用します。
反復文
`for`, `while`, `do` は、ループを実現する反復文に使用します。
ジャンプ文
`goto` はラベルの位置に無条件ジャンプします。
`continue` はループの本体をスキップし、ブロックの最後にジャンプします。
`break` はループのブロックから抜け出します。
`return` は関数から抜け出し、返却値のあるものは値を返します。
マルチスレッド
`_Atomic`, `_Thread_local` は、C11で追加された、マルチスレッドに関するキーワードです。
アライメント
`_Alignas`, `_Alignof` は、C11で追加された、アライメントに関するキーワードです。
その他
`inline` は、
C99で標準化された、関数指示子です。コンパイラにインライン展開のヒントを与えます。
`sizeof` は、式または型名のサイズを求める単項演算子です。
`_Static_assert` は、C11で追加された、コンパイル時の静的表明を提供します。
`_Generic` は、C11で追加された、型ジェネリックを提供するキーワードです。
`_Noreturn` は、C11で追加された、関数が return しないことを指定する関数指示子です。
脚注
関連項目
キーワード (C++))
CとC++の演算子