2-5 <発展> 変数の型と変換指定子の書き方

この記事は約4分で読めます。

本トピックは発展的な内容を扱うので飛ばして構いません。一通りC言語の学習を終えてから見ることをお勧めします。

変数の型について

2-3では代表的な変数の型について説明しましたが、ここではもっと深堀りします。

以下に型の一覧を示します。

正式名称略称(例)意味変換指定子
signed intint整数%d,%x,%o
unsigned intunsigned0以上の整数%u,%x,%o
signed long intlong桁数の大きい整数%ld,%lx,%lo
unsigned long intunsigned long桁数の大きい0以上の整数%lu,%lx,%lo
signed long long intlong long最も大きい整数%lld,%llx,%llo
unsigned long long intunsigned long long最も大きい0以上の整数%llu,%llx,%llo
doubledouble実数(=小数)%f,%lf
long doublelong double精度の高い実数%f,%lf
floatfloat実数%f
signed short intshort範囲の小さい整数%hd,%x,%o
unsigned short intunsigned short範囲の小さい0以上の整数%hu,%x,%o
charchar文字%c,%s(文字列)
signed charsigned char範囲の小さい整数%hhd,intと同じ
unsigned charunsigned char範囲の小さい0以上の整数%hhu,unsignedと同じ
void*void*(汎用)ポインタ%p
C言語の変数の型と変換指定子

※処理系によっては型がなかったり、フォーマット指定子が異なる場合があります。ポインタについては第9章で説明します。

表のとおり、型名には正式な名称が存在しますが長くてわかりにくくなるため略すことが多いです。

記憶クラス指定子と型修飾子

変数の定義についてですが、厳密には次のように記述します。

記憶クラス指定子 型修飾子 型名 変数名;

記憶クラス指定子は変数にメモリをどう割り当てるかを設定する語です。

記憶クラス指定子意味
auto自動変数
extern別ファイルで定義されいる
register高速なメモリを使う
static静的変数
typedef別名をつける。
記憶クラス指定子とその意味

autoをつけると自動変数となり、定義したブロック内でしか使えず、ブロックを抜けると消滅します。記憶クラス指定子をつけずに定義するとautoが付いた変数として解釈されます。よって普段はautoをつける必要がありません。むしろC++言語で別の意味が割り当てられているので使うべきではありません。

externは複数のファイルで変数を共有するときに使います。厳密にはexternを使うと定義ではなく宣言となります。別の場所で変数を定義してexternを使って宣言することはできますがexternで定義することはできません。

registerを使うと普通のメモリよりも読み書きスピードが速いメモリに保存することを指定できます。registerは昔コンパイラの最適化技術がうまく発達していなかった時に使われていたもので今はコンパイラが自動でレジスターに割り当てるか割り当てないか決定するので使う必要がありません。

static は静的な変数を指定します。autoと違いmain関数が始まる前から存在しmain 関数が終了するまで消滅しません。

typedefは厳密には変数の定義に使うものではありませんある変数の型名に対し別名を付けるときに使います。

型修飾子はその名前の通り型名を修飾します

型修飾子意味
const定数
farfarポインタ
long大きい型
nearnearポインタ
restrict最適化を促進
short小さい型
signed符号付き
unsigned符号なし
volatile最適化を抑制
型修飾子とその意味

constは定数を意味し、初期化した後値を書き換えることができません。初期化せずに定義するとコンパイルエラーとなります。

far,near 昔、16ビットのPCで使用されていました。今PCのプログラミングで使うことはありません。一部のマイコンや組み込みシステムで使用される可能性はあります。

restrict,volatile コンパイラの最適化に関する修飾子です。つけても付けなくてもC言語のレベルでは動作は変わりません。こちらも、一部のマイコンや組み込みシステムで使用される可能性はあります。

変換指定子

printfの変換指定子は最初の表のとおりです。xが付いている変換指定子は16進数を表しoが付いた変換指定子は8進数を表します。

コメント