変数

今回は変数とはなにかを学んでいきましょう。
HelloWorldで学んだプログラムを少し変更します。

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("5 * 13 = 65\n");
    return 0;
}

このコードをコンパイルして実行すると、「5 * 13 = 65」と表示されます。
しかし、実はこのプログラムは「5 * 13 = 65」という文字列を表示しているのでありコンピュータに計算を行わせていません。
コンピュータに計算させるには次のように書きます。

    printf("5 * 13 = %d\n", 5 * 13);

計算結果の65がコードから消え、代わりに「5 * 13」という式と、%dという見慣れない記号が出現しました。
上のコードは、%dの位置に5*13の計算結果を出力する、という構文(ルール)です。
ですが、これでは「5 * 13」しか計算することができません。
別の数字の掛け算を出力したいならば、コードを修正して再コンパイルする必要があるでしょう。

そこで、これらの値を格納しておく仕組みが必要です。

変数

プログラミングにおいて、変数(へんすう、variable)とは、プログラムのソースコードにおいて、扱われるデータを一定期間記憶し必要なときに利用できるようにするために、データに固有の名前を与えたものである。

Wikipedia-変数
変数と言えば数学で習った方程式に現れるx,yを思い出すでしょうが、プログラムでの変数は意味が違います。
この値を格納しておく箱が重要な意味を持ちます。

そこで必要になってくるのが変数であり、変数を扱うことはプログラムの基本中の基本と言っても過言ではありません。
変数を使って、コードを書き直すと次のようになります。

#include <stdio.h>

int main(int argc, char *argv[])
{
    int x;
    int y;
    x = 5;
    y = 13;
    printf("%d * %d = %d\n", x, y, x * y);
    return 0;
}

メモリ

変数、すなわち値を格納しておく箱はメモリ上で管理されます。
コンピュータのメモリは膨大な空間ですが、8ビット単位で管理されそれぞれアドレスが割り当てられています。
つまり、このアドレスを覚えておけば、値を一時的に確保しておくことや、値を置き換えてプログラムを実行する事ができるようになります。
ですが、このアドレスはコンピュータが理解しやすいようになっている為、人間には非常にわかりにくいものです。
そこで、プログラムでは変数の名前を自由につけ、コンパイラがアドレスに自動変換するようになっているのです。

しかし、実はこれでは不十分です。
整数をこの仕組みで管理した場合、扱える値の幅は8ビット、すなわち256種類です。
正の数だけとしたならば0〜255ですし、負の数を含めてしまうと-127〜128です。
ある程度の限定された用途であれば十分かもしれませんが、制限のほうが大きく扱いにくいでしょう。
では、管理単位を16ビット(2バイト)としたならばどうでしょうか?
0〜65,536または-32,768〜32,767となり、格段に使いやすくなります。
しかし、2バイトにした場合は使用するメモリのサイズは単純に倍となるでしょう。

近年のコンピュータの発達により、一般のパソコンですら1GBのメモリを搭載できるようになりました。
しかし、C言語が開発された頃のコンピュータは数百バイト程度のメモリしかなく、無駄なメモリはできる限り消費したくないのです。
負の数がなく256までで収まるもの(例えば都道府県)は1バイトで扱いたいし、数万程度で収まるもの(例えば市町村)は2バイトで扱いたいし、数億の桁が必要なもの(例えば人口)は8バイトで扱いたいのです。
そこで、変数には「どのくらいの大きさであるか?」を表す型という仕組みが加わります。

変数の型とサイズは言語の仕様であり、言語によって異なります。

C Java 説明
char 1byte 2byte -128〜127。Javaは2バイト文字を扱える
short なし 2byte 滅多に使わない
int 2byte or 4byte(*) 4byte -32768〜32767または-2147483648〜2147483647
long なし 8byte 約-922京〜約922京
 *)環境により異なる
Javaは90年代に開発された言語である為、全体的にメモリの使い方がリッチになっていますね。

変数の宣言と代入

では、あらためてコードを見ていきましょう。

    int x;

この1文は整数型(4バイト)でxという名の変数を使います、とコンピュータに命令しています。
つまり、メモリ上に4バイト分の領域が確保され、xという名前でメモリ上のアドレスを参照できるようになったのです。

では、この時にx(厳密にはxの値が格納されているメモリ)にはどのような値が格納されているでしょう?
これも言語仕様やコンパイラの仕様によりますが、一般的に初期値0が格納されます。

    int y;

に関しても同様に、メモリ上に整数型(4バイト)が確保され、そのアドレスがyで参照できるようになります。
この時、xのすぐ隣に確保される保障はありません。

    x = 5;
    y = 13;

この2行では、それぞれ変数に値を代入しています。
すなわち、xの変数が指すメモリ上のアドレスに5という数値を格納しています。
(この時、宣言時にintと宣言しているので、アドレスから4バイト分がxの領域と知ることができます。)
同様にyの場所には13が格納されます。

これで変数の宣言と代入が行われました。
これらはまとめて次のように記述できます。

    int x = 5;
    int y = 13;

これで

    printf("%d * %d = %d\n", x, y, x * y);</pre>

からはxとyという変数名で値を参照することができるようになったのです。

まとめ

変数とはプログラムを書く上で最も重要で基本的な仕組みです。
それは、メモリ上に一時的に値を格納する場所を確保することで、その場所と大きさがキーとなります。