##型分類
規格(C90)で定義された型分類が煩雑なので、表にまとめて見通しを良くしてみました。
型分類とは、派生型を表現する際に最外側に示す型(型が派生型を含まない場合、その型自身)となります。例えば「int
へのポインタ」の型分類は、ポインタ型となります。「int
の配列」の型分類は、配列型となります。「int
へのポインタの配列」の型分類は、配列型となります。
const
・volatile
のいずれか、およびその両方によって修飾された型T
は、T
の修飾版と呼びます。修飾されていない型T
は、T
の非修飾版と呼びます。
上の表を見て、こんなもんやってられるかー!と思った方は、人間として正常だと思います。しかし、ポイントとして以下を抑えておけば、当面は事足りるのではないかと思います。
- 算術型は、汎整数型+浮動小数点型。
- スカラ型は、算術型+ポインタ型。
- 集成体型は、配列型+構造体型。
- オブジェクト型は、関数型・不完全型を除くすべて。
##演算子のオペランドと結果の型
演算子のオペランドの型、および結果の型についてまとめてみました。
こちらも中々に煩雑ですが、C言語を一から設計しなおすなら、ここをこう定義すればスッキリするのにな~と、ハイボールでも飲みながらあーだこーだ独り言を言いながら眺めるのも一興かもしれません。
演算子 | オペランドの型 | 結果の型 |
---|---|---|
[] |
一方が型”T型オブジェクトへのポインタ”、片方が汎整数型 | T型 |
. |
(左)構造体型又は共用体型 (右)左オペランドのメンバ |
メンバの型(修飾版含む) |
-> |
(左)構造体型又は共用体型へのポインタ (右)左オペランドのメンバ |
メンバの型(修飾版含む) |
後置++
|
スカラ型(変更可能な左辺値) | 通常の算術型変換適用後のオペランドの型 |
後置--
|
同上 | 同上 |
前置++
|
同上 | 同上 |
前置--
|
同上 | 同上 |
アドレス演算子&
|
関数指示子、ビットフィールド、register 記憶域指定子つきで宣言されたオブジェクト以外の左辺値 |
オペランドの型へのポインタ型 |
単項*
|
T型へのポインタ型 | T型 |
単項+
|
算術型 | 汎整数拡張適用後のオペランドの型 |
単項-
|
算術型 | 同上 |
~ |
汎整数型 | 汎整数拡張適用後のオペランドの型 |
! |
スカラ型 |
int 型(0 または1 ) |
sizeof |
・(型名) ・関数型、不完全型、ビットフィールドを指す左辺値以外 |
size_t 型 |
キャスト(T)
|
・T にはvoid またはスカラ型を持つ型名を指定する。・ T がvoid の場合、オペランドは任意の型。・ T がスカラ型の場合、オペランドはスカラ型。 |
T 型 |
二項*
|
算術型 | 通常の算術型変換適用後の型 |
/ |
算術型 | 同上 |
% |
汎整数型 | 同上 |
二項+
|
・両オペランドが算術型 ・一方がオブジェクト型へのポインタでもう一方が汎整数型 |
・両オペランドが算術型の場合、通常の算術型変換適用後の型 ・一方がポインタオペランドの場合、ポインタオペランドの型 |
二項-
|
・両オペランドが算術型 ・両オペランドがオブジェクト型へのポインタ型 ・左がオブジェクト型へのポインタで右が汎整数型 |
・両方がポインタ型の場合、通常の算術型変換適用後の型 ・片方が算術型の場合、そのオペランドの型 ・両オペランドがポインタ型の場合、 ptrdiff_t 型 |
<< |
汎整数型 | 左オペランドの汎整数拡張適用後の型 |
>> |
同上 | 同上 |
< |
・算術型 ・オブジェクト型へのポインタ型 ・不完全型へのポインタ型 |
int 型(0 または1 ) |
> |
同上 | 同上 |
<= |
同上 | 同上 |
>= |
同上 | 同上 |
== |
・算術型 ・ポインタ型 ・一方がオブジェクト型へのポインタで、他方が void 型へのポインタ・一方がポインタ型で、他方が NULL
|
同上 |
!= |
同上 | 同上 |
ビット単位&
|
汎整数型 | オペランドの通常の算術型変換適用後の型 |
^ |
同上 | 同上 |
| |
同上 | 同上 |
&& |
スカラ型 |
int 型(0 または1 ) |
| | |
同上 | 同上 |
?: |
・第1オペランドはスカラ型 ・第2、第3オペランドは両方が算術型、両方が構造体型または共用体型、両方が void 型、両方がポインタ型、一方がポインタで他方がNULL 、一方がオブジェクト型または不完全型へのポインタで、他方がvoid 型 |
複雑なので別記事で書かせてくださいm(_ _)m |
代入=
|
複雑なので別記事で書かせてくださいm(_ _)m | 左オペランドの型の非修飾版 |
+= |
・左がオブジェクト型へのポインタ、右が汎整数型 ・両方が算術型 |
同上 |
-= |
同上 | 同上 |
*= |
二項* に倣う |
同上 |
/= |
/ に倣う |
同上 |
%= |
% に倣う |
同上 |
<<= |
<< に倣う |
同上 |
>>= |
>> に倣う |
同上 |
&= |
& に倣う |
同上 |
^= |
^ に倣う |
同上 |
|= |
| に倣う |
同上 |
, |
任意の型 | 右オペランドの型 |
##参考文献
「プログラム言語C JISX3010-1993 (ISO/IEC 9899:1990)」