第4回

変数ってなに?

00/06/23 解説文を大幅に訂正
99/06/30 解説文の一部を変更した
98/11/06 IE4.xに対応させた
98/04/29メールアドレス訂正

脳みそがBASICに最適化してしまった人の多くは、変数を「いろんなものの値を、仮に格納しておくところ」といった具合に捉えているのではないでしょうか。あ、それが悪いというわけじゃないです。だいたい、そういった感覚で値を扱うべく用意されたものこそ変数なのでしょうから。ただし、それはあくまで変数の正体を理解していることが前提での話ですけどね。

もっとも、以下のような処理の流れを目の当たりにすれば、変数をそのように捉えてしまうのは仕方がない気がします(青色で表示している部分が変数です)。


RPGによくある戦闘処理の一部、しかも超簡略(どうプログラミングするかは考えなくていい)

・画面に、変数(怪物の体力)の値を表示する。
・主人公が怪物に与えたダメージを変数(与えたダメージ)に代入する。
・画面に「主人公は、怪物に変数(与えたダメージ)ポイントのダメージを与えた。」と表示する。
・で、変数(怪物の体力)-変数(与えたダメージ)の値を、変数(怪物の体力)へ代入する。
・もし、変数(怪物の体力)の値が0以下の時は、画面に「怪物を倒した」と表示し、戦闘処理から抜ける。
・そうでない場合は、画面に変数(怪物の体力)の値を表示する。
・続いて、怪物側の攻撃の処理へ飛ぶ

以下省略



プログラミング経験の無い方でも、上記の流れを追えば何となく変数の役割がわかるでしょう(わ、わかるよね、何となく)。では実際に、変数というものを用いているC言語のプログラムを見てみましょう。以下は、本講座の第3回最後のプログラムの変数利用版です。ここではa変数となります。

#include<stdio.h>                                                                  
main(){  
    int a;      /*  このaが変数だ       */
    a=15;       /*  変数aに、15を代入   */
    printf(" 8進数:%o\n",a);
    printf("16進数:%x\n",a);
}
でもって、さっきのRPG戦闘処理の一部風に、このプログラムを解析してみます。

(3行目)aを、整数型の変数として宣言する。
(4行目)整数型変数a15を代入する。
(5行目)画面に、整数型変数aの値を8進数で表示する。
(6行目)画面に、整数型変数aの値を16進数で表示する。

こんな感じでプログラムを解析して、それを100%鵜呑みにした場合、C言語では後々苦労する羽目になるでしょう。なぜならC言語には、数多くの脱落者を生み出したポインタというものが存在するからです。
それでは一体、変数とは何なのか?それは、意外にも普通の国語辞典で調べてみると明らかになります。

私が愛用している三省堂の新明解国語辞典第4版には、(プログラムで使われる)変数の意味を、

電子計算機のプログラム中において、記憶場所の名称として用いられる文字(列)

と記しています。これはまさにその通りだと思います。
いろんな値を記憶するのはあくまでメモリであって、正確には変数ではありません。いろんな値は、メモリ上のどこかの位置(アドレス)に記憶されるのです。
つまりメモリ上にある何かの値をいじる際、その値が記憶されているメモリ上のアドレスを指し示す代わりに用いられる名前こそが変数なのでしょう(変数宣言時にアドレスを割り当てている)。
ところがポインタの場合、メモリ上の何かの値をいじる際、その値が記憶されているメモリ上のアドレスをもろに指し示すのです。その為、何かの値を変数の値と捉えつつも、実はそれがメモリ上のどこかのアドレスに記憶されているものであるということを意識できていないと、ポインタといったものが何であるのか理解できない状況に陥ってしまうのです。

説明が下手でごめんなさい。
つづく。


[メニュー][第3回][第5回]

いーざ
email:CQP00202@nifty.ne.jp