キーワード (C言語)

本記事では、C言語のキーワードに関して説明する。

本記事は、あくまでC言語のキーワードに焦点をあてた記事であり、C言語の全体像や、C言語のキーワード以外の面には立ち入らない。ISO/IEC 9899 に沿って記載する。読者の理解を助ける場合は適宜、他のプログラミング言語と比較する説明は行う。なお、1978年発行の書籍『The C Programming Language』（通称K&R、日本語訳は『プログラミング言語C』）第1版にはキーワードの記載が無かったが、1988年の第2版では付録A2.4に「キーワード（予約語）」がある。

 Cのキーワードの特徴 
キーワード数は以下の通り。
 K&R第2版 (1988): 32
 C89/C90: 32
 C99: 37。, , , ,  が追加。
 C11: 44。, , , , , ,  が追加。
基本型Type - cppreference.com、分岐 (if, switch)、反復 (for, while) などの基本的な語は、C++でもほぼそのまま取り入れられている。

 型に関するキーワード 
C++とほぼ共通の語を使用している。ただし、C99で導入された , , ,  は、C++03以降の規格でもキーワードとなっていない。

整数型
_Bool, char, short, int, long
C99以降では、 は2つ続けて  とすることで、64ビット以上の幅を持つ1つの型を表す。C99で加わった型も整数型の一種として扱われ、またやはキーワードではなく、で定義されるマクロである。

符号の有無
signed, unsigned
 および  は、整数型の前後に付加することによって符号の有無を指定する。

浮動小数点型
float, double
 は  と組み合わせて  型を表す際にも使用する。

複素数型
_Complex, _Imaginary
C99にて標準化。 は厳密には複素数型ではなく虚数型であり、すべての処理系でサポートされるわけではない。これらは直前に浮動小数点型を伴って精度を指定する。

記述例:
double _Complex z = 1.2 + 3.4 * I;

 構造体・共用体・列挙体 
struct, union, enum
これらは、タグ名を伴ってユーザー定義の型（構造体・共用体・列挙体）を定義するのに使用する。

記述例:
struct my_type
{
  int a;
  double b;
};

型修飾子
volatile, const, restrict
 はコンパイラの最適化を抑止する。
 はオブジェクトが書き換えられないことを明示する。
 はオブジェクトへのアクセスが常にそのポインタを用いて行われることを明示する。C99にて標準化。

記憶クラス指定子
auto, extern, static, register
 は自動記憶域期間 (automatic storage duration) を指定する。関数の引数を除く、ブロックスコープ (block scope) 内のオブジェクト（ローカル変数）にのみ指定可能Storage-class specifiers - cppreference.com。ブロックを抜けると寿命が尽きる自動変数の定義に使用する。ただし記憶クラス指定子を省略した場合はデフォルトでとなるため、事実上使用されていない。B言語の指定子との互換を意識したもの。C++にも存在するが、C++11で仕様が変更され、型推論の機能に使われるようになったので注意が必要となる。
 は静的記憶域期間と外部リンケージを指定する。他のモジュール内で定義されている名前を参照する際に使う。変数に指定した場合は、いわゆるグローバル変数となる。
 は静的記憶域期間と内部リンケージを指定する。ファイルスコープ（関数外）の変数または関数と、ブロックスコープ（関数内）の変数に指定可能だが、それぞれ意味が異なる。ファイルスコープの場合は可視性の制限で、の対となり、指定した変数や関数は他のモジュールから参照できない。ブロックスコープの場合は静的記憶域期間の指定で、の対となり、指定した変数はプログラムの開始時に一度だけメモリ確保・初期化され、プログラムの終了時に寿命が尽きる静的ローカル変数となる。
 は変数の記憶領域をCPUのレジスタに割り当てる（必ずしも割り当てられるわけではない）。それ以外はと同じ。
typedef

型に別名を付ける。これは構文上は記憶クラス指定子に分類されるが、記憶クラスと直接関係はない。

その他の型
void
引数または返却値のない関数の宣言や定義に使用する。また、特定の型を指さないポインタ型にも使用する。

記述例:
void func(void);

int a;
void *p = &a;

 制御構造 
制御に関する語もC++とほぼ共通であるが、Cには例外処理に関する語（try, catch, throw等）は存在しない。

 選択文 
if, else
switch, case, default

条件分岐を実現する選択文 (selection statements) に使われる。

 反復文 
for, while, do

ループを実現する反復文 (iteration statements) に使われる。

 ジャンプ文 
goto
ラベルの位置に無条件ジャンプする。
continue
ループの本体をスキップし、ブロックの最後にジャンプするcontinue statement - cppreference.com。
break
ループのブロックから抜け出す。
return
関数から抜け出す。返却値のあるものは値を返す。

 マルチスレッド 
_Atomic, _Thread_local
C11にて追加

 アライメント 
_Alignas, _Alignof
C11にて追加

 その他 
インライン関数
inline
C99にて標準化。関数指示子に使用することで、関数をインライン展開するためのヒントをコンパイラに与える。

 演算子 
sizeof
式、またはかっこでくくった型名をオペランドに取る単項演算子として使用する。

 アサート 
_Static_assert
C11にて追加。コンパイル時の静的表明を提供する。

 型ジェネリック 
_Generic
C11にて追加

 関数指定子 
_Noreturn
C11にて追加。関数が return しない（呼び出し元に戻らない）ことを指定。

 脚注 

 関連項目 
 キーワード (C++)
 CとC++の演算子

きわと (Cけんこ)
きわと
Cけんこ