キーワード (C言語)

C言語 > キーワード (C言語) 本記事では、C言語のキーワードに関して説明する。 本記事は、あくまでC言語のキーワードに焦点をあてた記事であり、C言語の全体像や、C言語のキーワード以外の面には立ち入らない。ISO/IEC 9899 に沿って記載する。読者の理解を助ける場合は適宜、他のプログラミング言語と比較する説明は行う。なお、1978年発行の書籍『The C Programming Language』（通称K&R、日本語訳は『プログラミング言語C』）第1版にはキーワードの記載が無かったが、1988年の第2版では付録A2.4に「キーワード（予約語）」がある。 索引 auto break case char const continue default do double else enum extern float for goto if inline int long register restrict return short signed sizeof static struct switch typedef union unsigned void volatile while _AlignasC11 _AlignofC11 _AtomicC11 _BoolC99 _ComplexC99 _GenericC11 _ImaginaryC99 _NoreturnC11 _Static_assertC11 _Thread_localC11 キーワード数は以下の通り。 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 は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 は自動記憶域期間 (automatic storage duration) を指定する。関数の引数を除く、ブロックスコープ (block scope) 内のオブジェクト（ローカル変数）にのみ指定可能。ブロックを抜けると寿命が尽きる自動変数の定義に使用する。ただし記憶クラス指定子を省略した場合はデフォルトでautoとなるため、事実上使用されていない。B言語のauto指定子との互換を意識したもの。C++にも存在するが、C++11で仕様が変更され、型推論の機能に使われるようになったので注意が必要となる。 extern は静的記憶域期間と外部リンケージを指定する。他のモジュール内で定義されている名前を参照する際に使う。変数に指定した場合は、いわゆるグローバル変数となる。 static は静的記憶域期間と内部リンケージを指定する。ファイルスコープ（関数外）の変数または関数と、ブロックスコープ（関数内）の変数に指定可能だが、それぞれ意味が異なる。ファイルスコープの場合は可視性の制限で、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 条件分岐を実現する選択文 (selection statements) に使われる。 for, while, do ループを実現する反復文 (iteration statements) に使われる。 goto ラベルの位置に無条件ジャンプする。 continue ループの本体をスキップし、ブロックの最後にジャンプする。 break ループのブロックから抜け出す。 return 関数から抜け出す。返却値のあるものは値を返す。 _Atomic, _Thread_local C11にて追加 _Alignas, _Alignof C11にて追加 inline C99にて標準化。関数指示子に使用することで、関数をインライン展開するためのヒントをコンパイラに与える。 sizeof 式、またはかっこでくくった型名をオペランドに取る単項演算子として使用する。 _Static_assert C11にて追加。コンパイル時の静的表明を提供する。 _Generic C11にて追加 _Noreturn C11にて追加。関数が return しない（呼び出し元に戻らない）ことを指定。 ^ Type - cppreference.com ^ Storage-class specifiers - cppreference.com ^ continue statement - cppreference.com キーワード (C++) CとC++の演算子