本トピックは発展的な内容を扱うので飛ばして構いません。一通りC言語の学習を終えてから見ることをお勧めします。
変数の型について
2-3では代表的な変数の型について説明しましたが、ここではもっと深堀りします。
以下に型の一覧を示します。
正式名称 | 略称(例) | 意味 | 変換指定子 |
signed int | int | 整数 | %d,%x,%o |
unsigned int | unsigned | 0以上の整数 | %u,%x,%o |
signed long int | long | 桁数の大きい整数 | %ld,%lx,%lo |
unsigned long int | unsigned long | 桁数の大きい0以上の整数 | %lu,%lx,%lo |
signed long long int | long long | 最も大きい整数 | %lld,%llx,%llo |
unsigned long long int | unsigned long long | 最も大きい0以上の整数 | %llu,%llx,%llo |
double | double | 実数(=小数) | %f,%lf |
long double | long double | 精度の高い実数 | %f,%lf |
float | float | 実数 | %f |
signed short int | short | 範囲の小さい整数 | %hd,%x,%o |
unsigned short int | unsigned short | 範囲の小さい0以上の整数 | %hu,%x,%o |
char | char | 文字 | %c,%s(文字列) |
signed char | signed char | 範囲の小さい整数 | %hhd,intと同じ |
unsigned char | unsigned char | 範囲の小さい0以上の整数 | %hhu,unsignedと同じ |
void* | void* | (汎用)ポインタ | %p |
※処理系によっては型がなかったり、フォーマット指定子が異なる場合があります。ポインタについては第9章で説明します。
表のとおり、型名には正式な名称が存在しますが長くてわかりにくくなるため略すことが多いです。
記憶クラス指定子と型修飾子
変数の定義についてですが、厳密には次のように記述します。
記憶クラス指定子 型修飾子 型名 変数名;
記憶クラス指定子は変数にメモリをどう割り当てるかを設定する語です。
記憶クラス指定子 | 意味 |
auto | 自動変数 |
extern | 別ファイルで定義されいる |
register | 高速なメモリを使う |
static | 静的変数 |
typedef | 別名をつける。 |
autoをつけると自動変数となり、定義したブロック内でしか使えず、ブロックを抜けると消滅します。記憶クラス指定子をつけずに定義するとautoが付いた変数として解釈されます。よって普段はautoをつける必要がありません。むしろC++言語で別の意味が割り当てられているので使うべきではありません。
externは複数のファイルで変数を共有するときに使います。厳密にはexternを使うと定義ではなく宣言となります。別の場所で変数を定義してexternを使って宣言することはできますがexternで定義することはできません。
registerを使うと普通のメモリよりも読み書きスピードが速いメモリに保存することを指定できます。registerは昔コンパイラの最適化技術がうまく発達していなかった時に使われていたもので今はコンパイラが自動でレジスターに割り当てるか割り当てないか決定するので使う必要がありません。
static は静的な変数を指定します。autoと違いmain関数が始まる前から存在しmain 関数が終了するまで消滅しません。
typedefは厳密には変数の定義に使うものではありませんある変数の型名に対し別名を付けるときに使います。
型修飾子はその名前の通り型名を修飾します
型修飾子 | 意味 |
const | 定数 |
far | farポインタ |
long | 大きい型 |
near | nearポインタ |
restrict | 最適化を促進 |
short | 小さい型 |
signed | 符号付き |
unsigned | 符号なし |
volatile | 最適化を抑制 |
constは定数を意味し、初期化した後値を書き換えることができません。初期化せずに定義するとコンパイルエラーとなります。
far,near 昔、16ビットのPCで使用されていました。今PCのプログラミングで使うことはありません。一部のマイコンや組み込みシステムで使用される可能性はあります。
restrict,volatile コンパイラの最適化に関する修飾子です。つけても付けなくてもC言語のレベルでは動作は変わりません。こちらも、一部のマイコンや組み込みシステムで使用される可能性はあります。
変換指定子
printfの変換指定子は最初の表のとおりです。xが付いている変換指定子は16進数を表しoが付いた変換指定子は8進数を表します。
コメント