第2回 変数について

公開日:2014-10-14

1. 概要

独り言によるプログラミング講座「第2回 変数について」です。
変数の使い方や、数値と数字(文字)の違いなどについて説明しています。

2. 動画


3. 補足

1. 変数の概要

変数は、数値、文字列(複数の文字)、オブジェクトなどを入れることができる器です。
数学に出てくる y = x^2 などの式の x や y と同じです。
プログラムでは、変数に1文字以上の好きな名前を付けることができます。
中に入れる値によって、変数名を付けると、プログラムが見やすくなります。
例えば、
x と y と言う変数名であれば「座標」、
name であれば「名前」、
value であれば「値」、
が入っていると推測できます。
変数名には、漢字やひらがななどの日本語も使えますが、
予期せぬ場所で不具合が発生しないとも言えないため、基本的に英数字を使用します。
そのため、意味やニュアンスの異なる英語を間違えて変数名にしてしまうと言う問題点があります。

2. 変数の型

変数には数値以外の文字、文字列、オブジェクトなどを入れることができるため、
プログラミング言語によっては、変数ごとに、入れる値の型を指定する必要があります。
例えば、
変数 name には名前が入るので、文字列型、
変数 value には数値が入るので、数値型
のように指定します。
C#の場合であれば以下のように書きます。
ソース
string name;
int value;
型を指定する必要があるのは、
元々は、プログラムをコンピューターが処理しやすくするためでした。
型を指定することにより、型の異なる値を間違って変数に入れてしまう、と言ったプログラムのミスを事前にチェックすることができます。

3. 変数の用途

変数は、プログラム中に固定で書くことができない値を使う場合など、値が動的に変わる場合に使用します。
例えばユーザーに入力された2つの値を加算するプログラムは次のような流れになります。
ソース
input1 = ユーザーの入力値1
input2 = ユーザーの入力値2
result = input1 + input2
ユーザーの入力値は、事前にわからないため、プログラム中に入力値を書くことができません。
そのため、入力値を変数で受け取って、加算処理を行います。

変数はいろいろなところで使いますが、単純なところで、
値を省略するためにも使えます。
例えば次のソースは、
ソース
面積1 = 3.1415926535 * 3 * 3

面積2 = 3.1415926535 * 6 * 6

面積3 = 3.1415926535 * 9 * 9
以下のように変数PIに事前に円周率を入れることにより、
何度も「3.1415926535」と書く必要がなくなります。
半径の 3、6、9 も、わざと半径と言う変数に入れることにより、
プログラムを見やすくすることができます。
ソース
PI = 3.1415926535

半径1 = 3;
面積1 = PI * 半径1 * 半径1

半径2 = 6;
面積2 = PI * 半径2 * 半径2

半径3 = 9;
面積3 = PI * 半径3 * 半径3
間違えないようにプログラムを入力すれば良いのですが、
必ず入力ミスは発生するため、重複する箇所はまとめるのが望ましいです。
また、上記のように変数(PI)を使えば、
円周率を「3.14159265358979323846」のように精度を上げたい場合でも、
1箇所修正するだけで済みます。

4. 変数ができた理由

パソコンはメモリと言う記憶装置で情報を保持します。
メモリは1バイト単位で数値(0~255)を保持し、
例えば4GB(ギガバイト)のメモリであれば、
4 * 1024 * 1024 * 1024個 = 4294967296個の数値(0~255)を保持することができます。

メモリの値を読み書きする場合、アドレス(メモリ上の住所)を指定して読み書きします。
アドレスは、単純に 0 からの連番の数値が付与されています。
例えば、先頭のアドレスに数値の 10 を書き込む時は、
「0番地に10を書き込む」と言うプログラムを書きます。
例えば先ほどの円の面積を求めるプログラムは以下のようになります。
ソース
メモリ[0000] = 3.14159 26535

メモリ[0001] = 3;
メモリ[0002] = メモリ[0000] * メモリ[0001] * メモリ[0001]

メモリ[0003] = 6;
メモリ[0004] = メモリ[0000] * メモリ[0003] * メモリ[0003];

メモリ[0005] = 9;
メモリ[0006] = メモリ[0000] * メモリ[0005] * メモリ[0005];
コンピューターが処理する場合はこれで問題ないのですが、
見てわかる通り、処理している内容がわかりづらく、
アドレスの指定を間違えたり、重複して同じアドレスを使用してしまうなどのバグが、必ず発生します。
そこで、わかりやすくするために、アドレスに名前をつけるようにしました。
それが変数です。

そのため、変数には保持している値以外にも、対応するメモリのアドレスがわかるように管理されています。
C言語などでは、このアドレスを意識してプログラムを作る必要があるため、
メモリを直接操作しなくても良いプログラミング言語(Java、C#、PHP、JavaScript など)などに比べると、
バグが発生するポイントが多くなります。
特に、アドレスを意識する必要がない箇所でもアドレスを意識する必要があるため、難易度は高くなります。