7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

C90の型分類と、演算子のオペランドの型

Posted at

##型分類
規格(C90)で定義された型分類が煩雑なので、表にまとめて見通しを良くしてみました。

C90型分類.png

型分類とは、派生型を表現する際に最外側に示す型(型が派生型を含まない場合、その型自身)となります。例えば「intへのポインタ」の型分類は、ポインタ型となります。「intの配列」の型分類は、配列型となります。「intへのポインタの配列」の型分類は、配列型となります。

constvolatileのいずれか、およびその両方によって修飾された型Tは、T修飾版と呼びます。修飾されていない型Tは、T非修飾版と呼びます。

上の表を見て、こんなもんやってられるかー!と思った方は、人間として正常だと思います。しかし、ポイントとして以下を抑えておけば、当面は事足りるのではないかと思います。

  • 算術型は、汎整数型+浮動小数点型。
  • スカラ型は、算術型+ポインタ型。
  • 集成体型は、配列型+構造体型。
  • オブジェクト型は、関数型・不完全型を除くすべて。

##演算子のオペランドと結果の型

演算子のオペランドの型、および結果の型についてまとめてみました。

こちらも中々に煩雑ですが、C言語を一から設計しなおすなら、ここをこう定義すればスッキリするのにな~と、ハイボールでも飲みながらあーだこーだ独り言を言いながら眺めるのも一興かもしれません。

演算子 オペランドの型 結果の型
[] 一方が型”T型オブジェクトへのポインタ”、片方が汎整数型 T型
. (左)構造体型又は共用体型
(右)左オペランドのメンバ
メンバの型(修飾版含む)
-> (左)構造体型又は共用体型へのポインタ
(右)左オペランドのメンバ
メンバの型(修飾版含む)
後置++ スカラ型(変更可能な左辺値) 通常の算術型変換適用後のオペランドの型
後置-- 同上 同上
前置++ 同上 同上
前置-- 同上 同上
アドレス演算子& 関数指示子、ビットフィールド、register記憶域指定子つきで宣言されたオブジェクト以外の左辺値 オペランドの型へのポインタ型
単項* T型へのポインタ型 T型
単項+ 算術型 汎整数拡張適用後のオペランドの型
単項- 算術型 同上
~ 汎整数型 汎整数拡張適用後のオペランドの型
! スカラ型 int型(0または1
sizeof ・(型名)
・関数型、不完全型、ビットフィールドを指す左辺値以外
size_t
キャスト(T) Tにはvoidまたはスカラ型を持つ型名を指定する。
Tvoidの場合、オペランドは任意の型。
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)」

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?