型修飾子とは
型修飾子とは変数のデータ型の宣言の前に記述する指定子です。
これを使うことで、変数や関数に更に細かい指定をつけることができます。
ここでは、よく使われるものを中心に型修飾子をいくつか紹介していきます。
signed、unsigned
データ型の符号の有無を決めることが出来ます。
unsigned int a
と宣言すると、変数aは符号なし整数型となります。
signedは符号ありのデータ型を指定しますが、これは省略できます。
すなわち、
signed int a
int a
は同値です。
確保したメモリ領域の最上位ビットを符号として扱うだけなので、signedでもunsignedでも扱える値の総数は変わりません。
例えば、8ビットの領域の符号なし整数型は0~255ですが、符号ありは-128~127となります。
short、long
変数のメモリ領域の大きさを変えることができます。
例えば、intの持つ範囲よりも大きい値を扱いたいときはlongを使います。
逆にint型では確保領域が大きすぎて、メモリが無駄になる場合はshortを使いますが、最近はメモリの容量が増えているため節約の意味はあまりありません。ですが、予期しない値を代入できないようにするのに有効です。
前項のsigned、unsignedと組み合わせて使うこともできます。
unsigned long double a
また、int型の場合はintを省略できます。
つまり、
short int a
short a
は同値です。
const
const修飾子をつけた変数は、以降値の変更ができません。
そのため定数として扱うことができます。
後から値を入れることができないため、宣言と同時に初期化する必要があります。
詳しくはこちら。
static
通常、ローカル変数は宣言時に初期化され、スコープを抜ける時に開放されます。
例えば何度も呼び出す関数内のローカル変数は、呼び出しの度に初期化され、別の領域を確保します。
ですがstatic修飾子を用いればスコープを抜けても変数が保持されます。
スコープ内でのみ使えるグローバル変数のようなものです。
auto、extern
autoはローカル変数であることを指定します。
しかし、一般の変数は全てローカル変数なので、この指定の必要はありません。
これはC言語の前身であるB言語との互換性を保つために存在します。
extern宣言は、宣言した変数が別のファイルで定義されていることを示します。
複数のファイルを同時にコンパイルしたとき、一方のファイルで宣言したグローバル変数は別のファイルでは使用できません。
だからといって、それぞれのファイルで同名のグローバル変数を定義すると、同名の変数が複数宣言されていることになるので環境によってはコンパイルエラーもしくは警告がでます。
そこで使うのがextern宣言です。
一方のファイルでは通常のグローバル変数を宣言し、他のファイルではexternを使います。
これで全ファイル共通のグローバル変数が定義できます。
詳しくはこちら。
register
通常変数はメモリ上のどこかに確保されます。
しかし、register修飾子を使うと、変数をレジスタ上に確保することができます。
コンピュータは、容量とアクセス速度が反比例する複数の記憶媒体を持っており、レジスタは最も容量が少なく高速な記憶媒体のことをいいます。
つまり、レジスタ上に確保するということは、容量は限られているが高速にアクセスできる変数を用意できるということです。
極端にアクセス頻度の高い変数をregister宣言すると、大幅に実行速度を高めることが出来る場合があります。
しかし、記憶容量は少ないので、何でもかんでもレジスタに保存することはできません。
レジスタの容量を超えた場合は、自動でメモリに領域を確保します。