キーワード (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
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
が追加。
基本型[1]、分岐 (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 my_type
{
int a;
double b;
};
型修飾子
編集- volatile, const, restrict
volatile
はコンパイラの最適化を抑止する。const
はオブジェクトが書き換えられないことを明示する。restrict
はオブジェクトへのアクセスが常にそのポインタを用いて行われることを明示する。C99にて標準化。
記憶クラス指定子
編集- auto, extern, static, register
auto
は自動記憶域期間 (automatic storage duration) を指定する。関数の引数を除く、ブロックスコープ (block scope) 内のオブジェクト(ローカル変数)にのみ指定可能[2]。ブロックを抜けると寿命が尽きる自動変数の定義に使用する。ただし記憶クラス指定子を省略した場合はデフォルトでauto
となるため、事実上使用されていない。B言語のauto
指定子との互換を意識したもの。C++にも存在するが、C++11で仕様が変更され、型推論の機能に使われるようになったので注意が必要となる。extern
は静的記憶域期間と外部リンケージを指定する。他のモジュール内で定義されている名前を参照する際に使う。変数に指定した場合は、いわゆるグローバル変数となる。static
は静的記憶域期間と内部リンケージを指定する。ファイルスコープ(関数外)の変数または関数と、ブロックスコープ(関数内)の変数に指定可能だが、それぞれ意味が異なる。ファイルスコープの場合は可視性の制限で、extern
の対となり、static
指定した変数や関数は他のモジュールから参照できない。ブロックスコープの場合は静的記憶域期間の指定で、auto
の対となり、static
指定した変数はプログラムの開始時に一度だけメモリ確保・初期化され、プログラムの終了時に寿命が尽きる静的ローカル変数となる。register
は変数の記憶領域をCPUのレジスタに割り当てる(必ずしも割り当てられるわけではない)。それ以外はauto
と同じ。- typedef
- →詳細は「typedef」を参照
- 型に別名を付ける。これは構文上は記憶クラス指定子に分類されるが、記憶クラスと直接関係はない。
その他の型
編集記述例:
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
- ループの本体をスキップし、ブロックの最後にジャンプする[3]。
- break
- ループのブロックから抜け出す。
- return
- 関数から抜け出す。返却値のあるものは値を返す。
マルチスレッド
編集- _Atomic, _Thread_local
- C11にて追加
- _Alignas, _Alignof
- C11にて追加
その他
編集- inline
- C99にて標準化。関数指示子に使用することで、関数をインライン展開するためのヒントをコンパイラに与える。
演算子
編集- sizeof
- 式、またはかっこでくくった型名をオペランドに取る単項演算子として使用する。
アサート
編集- _Static_assert
- C11にて追加。コンパイル時の静的表明を提供する。
型ジェネリック
編集- _Generic
- C11にて追加
関数指定子
編集- _Noreturn
- C11にて追加。関数が return しない(呼び出し元に戻らない)ことを指定。