キーワード (C言語)

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

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

Cのキーワードの特徴 
キーワード数は以下の通り。
 K&R第2版 (1988): 32
 C89: 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++とほぼ共通の語を使用している。

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

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

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

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

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

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

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

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

記憶クラス指定子
auto, extern, static, register
auto は宣言したブロック内のみで有効。関数が終了すると消滅。記憶クラス指定子を省略した場合デフォルトでautoとなる。そのため実際上使用されていない。B言語のauto指定子との互換を意識したもの。C++にも存在するが、C++11で機能が変更されたので注意。
extern は他のモジュール内で定義されている名前を参照する際に使う。
static は関数内と関数外で意味が違う。関数内では静的変数の定義で、autoとは異なり関数が終了しても消滅せず、再び同じ関数を呼び出した場合は前回の値がそのまま残っている。関数外では可視性の制限で、static宣言した変数や関数は他のモジュールから参照できない。
register は変数の記憶領域をCPUのレジスタに割り当てる（必ずしも割り当てられるわけではない）。それ以外はautoと同じ。
typedef

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

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

記述例:
void func(void);

int a;
void *p = &a;

制御構造 
制御に関する語も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++の演算子

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