「キーワード (C言語)」の版間の差分
表示
削除された内容 追加された内容
編集の要約なし |
|||
80行目: | 80行目: | ||
記述例: |
記述例: |
||
< |
<syntaxhighlight lang="c"> |
||
double _Complex z = 1.2 + 3.4 * I; |
double _Complex z = 1.2 + 3.4 * I; |
||
</syntaxhighlight> |
|||
</source> |
|||
===[[構造体]]・[[共用体]]・[[列挙型|列挙体]]=== |
===[[構造体]]・[[共用体]]・[[列挙型|列挙体]]=== |
||
89行目: | 89行目: | ||
記述例: |
記述例: |
||
< |
<syntaxhighlight lang="c"> |
||
struct my_type |
struct my_type |
||
{ |
{ |
||
95行目: | 95行目: | ||
double b; |
double b; |
||
}; |
}; |
||
</syntaxhighlight> |
|||
</source> |
|||
===型修飾子=== |
===型修飾子=== |
||
118行目: | 118行目: | ||
記述例: |
記述例: |
||
< |
<syntaxhighlight lang="c"> |
||
void func(void); |
void func(void); |
||
int a; |
int a; |
||
void *p = &a; |
void *p = &a; |
||
</syntaxhighlight> |
|||
</source> |
|||
== 制御構造 == |
== 制御構造 == |
2020年7月5日 (日) 22:42時点における版
この項では、C言語のキーワードに関して説明する。
この項目は、プログラムの細かい説明には立ち入らず、他の言語と比較できるような説明を目的としている。ISO/IEC 9899 に沿って記載する。なお、1978年のK&R第1版にはキーワードの記載が無かったが、1988年の第2版では付録A2.4に「キーワード(予約語)」がある。
- 索引
- alignofC11
- 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
- _Alignas
- _AtomicC11
- _BoolC99
- _ComplexC99
- _GenericC11
- _ImaginaryC99
- _NoreturnC11
- _Static_assertC11
- _Thread_localC11
Cのキーワードの特徴
キーワード数は以下の通り。
- K&R第2版 (1988): 32
- C89: 32
- C99: 37。_Bool, _Complex, _Imaginary, inline, restrict が追加。
- C11: 44。_Alignas, _Atomic, _Generic, _Noreturn, _Static_assert, _Thread_local, alignof が追加。
プリミティブ型、分岐 (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指定子との互換を意識したもの。
- 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
- for, while, do
分岐
- goto
- ラベルの位置に分岐する。
- continue
- ループの先頭に戻る。
- break
- ループのブロックから抜け出す。
- return
- 関数から抜け出す。返却値のあるものは値を返す。
マルチスレッド
- _Atomic, _Thread_local
- C11にて追加
- _Alignas, alignof
- C11にて追加
その他
演算子
- sizeof
- 式、またはかっこでくくった型名をオペランドに取る単項演算子として使用する。
アサート
- _Static_assert
- C11にて追加。静的表明を提供する。
型ジェネリック
- _Generic
- C11にて追加
関数指定子
- _Noreturn
- C11にて追加。関数が return しない(呼び出し元に戻らない)ことを指定。