前回、定数値と式を用いた計算結果を printf()関数で画面に表示する方法を解説しました。今回は、式の結果を保存し、必要な場面で取り出す方法についてご説明します。
定数は、その名の通り固定された値であり、何度プログラムを実行しても、その値が変化することはありませんでした。コード上に書かれた100という定数は、つねに100という結果を返します。これに対して、何らかの値を格納し、自由にその値を変化させる出来る特別な数を変数と呼びます。変数は、定数と同じように値として扱うことができますが、その内容は実行時でなければ判断できません。変数には、任意のタイミングで、任意の値を保存できます。
変数は、関数名と同様に名前によって識別されます。そのため、変数を利用するには、事前に変数を宣言しなければなりません。変数の宣言では、使用する変数の名前と型をあらかじめ指定します。値には型があることを前回で学習しました。変数は何らかの値を格納するため、その値の型を指定しなければならないのです。たとえば、整数を格納する変数は、整数型の変数となります。変数を宣言することで、指定した変数名を使って値を保存したり、保存した値を取り出すことができます。
Visual C++ 2008 Express Editionのインストールや設定方法については「ゼロからはじめるC言語 - 環境構築編」を参照してください。
宣言
変数の宣言は、関数の中と外の2カ所に書く方法があります。関数の中で宣言した変数は、その関数の中でしか使うことができません。これをローカル変数と呼びます。これに対して、関数の外で宣言した変数をグローバル変数と呼び、あらゆる場所で利用できます。宣言は、細かく追求すると非常に多くの書き方があり複雑です。もっとも簡単な方法は、型と変数名を指定する次のような書き方です。
型 変数名 ;
型には、これまでも何度が登場した整数型を表すintキーワードのような、宣言する変数の型を指定します。整数や浮動小数点数、文字などの基本的な型は、C言語のキーワードとして用意されています。これらのことを型指定子と呼びます。C言語のキーワードで用意されている型指定子を表 01に列挙します。
表01 主な型指定子
型指定子 | 説明 |
---|---|
void | 値や型がないことを表す特殊なキーワード。 |
char | 1 文字を表す 1 バイトの型。 |
short | 短い整数を表す 2 バイトの型。 |
int | 整数を表す 4 バイトの型。 |
long | 長い整数を表す 4 バイトの型。 |
float | 浮動小数点数を表す 4 バイトの型。 |
double | 浮動小数点数を表す 8 バイトの型。 |
signed | 符号付き整数を表す。 |
unsigned | 符号なし整数を表す。 |
これらの型指定子が表すデータサイズは、歴史的な背景もあって統一されておらず、初心者の方がC言語を学習するときに混乱する要因の1つとなっています。型指定子は、他の型指定子と混合することができますが、いくつかは意味が重複し、しかも処理系に実体のデータサイズが依存します。表01で書いている型指定子のデータサイズは、Visual C++で作成するプログラムの場合です。まず、順にご説明しましょう。
最初のvoidは特殊な型指定子で、値や型がないことを表します。voidキーワードは、通常の変数の型としては使えません。このキーワードが使えるのは、関数の戻り値型、関数の仮パラメータ、そしてポインタ型と呼ばれる変数の宣言のみです。これらについては、関数やポインタについて解説するときに合わせてご説明します。この場でvoidを使うことはありません。
charはASCIIコードの1文字を表す型で、1バイトのデータサイズの変数です。この変数は1バイト、すなわち8ビット(8桁の2進数)のデータサイズなので0 ~ 255までの数を表すことができます。このデータ型は、シンプルで分かりやすいですね。
次のshort、int、long の関係が多少、複雑になります。C言語は、Windows以外にも多くの環境で実装されるプログラミング言語です。PCだけではなく、ゲームや組み込みなど、さまざまなハードウェア環境が想定され、C言語によって作られるプログラムも、インテル互換の機械語だけとは限りません。よって、整数のサイズは処理系に依存するものとして、伝統的に統一されてきませんでした。
まず、基準になるのは int型です。int型の変数は、その対象となるコンピュータが扱う16ビット以上で自然な整数のサイズとされています。歴史的に、16ビットのコンピュータでは16ビット、32ビットのコンピュータでは32ビットとされてきました。short型は、少なくともintと同じかそれ以下、long型は、intと同じかそれ以上の整数であることを保証します。32ビット環境では、short型は16ビットであることが多く、long型は32ビットか64ビットであることが多いです。Visual C++の場合、longもまた32ビットとなります。
float型は単精度浮動小数点数、double型は倍精度浮動小数点数を表す型で、int型と同様にそのサイズは環境によって異なるとされてきました。Visual C++の場合、floatは32ビット、doubleは64ビットとなります。
signedとunsignedは、符号付きと符号なし、すなわち負数を表現することができる整数かどうかを表します。コンピュータの2進数の世界では、負数を表現するために最上位ビットをフラグとして利用します。負数であれば、最上位ビットが1になり、残りのビットの2の補数が絶対値を表します。よって、符号付きか符号なしかによって、整数型が表現できる値の範囲が変わってきます。これらの型指定子は、charまたは整数型と組み合わせることができます。
signedとunsignedを単体で宣言した場合、変数は整数型となります。signedやunsignedを指定しないchar型や整数型の変数は、自動的に符号付きと解釈されます。さらに、型指定子を指定しないで変数を宣言した(型を省略した)場合はint型と解釈されます。
ここまでの説明でも、変数の宣言が何やら面倒で複雑なものと感じられる方は多いのではないでしょうか。変数の型指定子として考えられる組み合わせを表 02にまとめてみましょう。
表02 型指定子の組み合わせ
型指定子 | 説明 |
---|---|
char | 文字型 |
signed char | 符号付1バイト |
unsigned char | 符号なし1バイト |
short signed short short int signed shrt int |
符号付きの短い整数 |
unsigned short unsigned short int |
符号なしの短い整数 |
int signed signed int |
符号付きの整数 |
unsigned unsigned int |
符号なしの整数 |
long signed long long int signed long int |
符号付きの長い整数 |
unsigned long unsigned long int |
符号なしの長い整数 |
float | 単精度浮動小数点数 |
double | 倍精度浮動小数点数 |
long double | 長い倍精度浮動小数点数 |
型指定子の順序は入れ替えることができます。short int を int shortと書いても同じです。
何やら複雑な関係に思えますが、基本的にはchar、short、int、long、float、doubleの6つの型指定で事足ります。加えて、整数には符号なしにしたい場合にunsignedを付加する、という程度で十分です。signedを明示的に指定する理由はありません。
char c;
int i;
double d;
上記は、それぞれchar型、int型、double型の変数の宣言例です。変数の名前にはc、i、dと1文字の簡単なアルファベットを指定していますが、本番の開発では selectionCode、value、loopCounter など、意味をもつ名前を付けるべきです。変数の命名規則を設けることで読みやすいコードを書くテクニックというのにも多くの議論がありますが、本稿内では簡単な変数名を用います。
ちなみに、64 ビットに対応しているCPUを搭載しているコンピュータでもint型は32ビットが一般的です。本シリーズでは64ビットプログラミングについては扱いません。Visual C++ による64ビット環境に対応については以下のMicrosoftのWebページが参考になります。