KID's World
 

おしながき
トップページ
プログラミング
研究
いんすぴ
色日記
ソフトウェア
KID's Worldの歴史
リンク
小出俊夫について


変数とは何なのか

変数の意味と基本的な使い方を知る

 

数値を記録するには?

 なんだか文字が表示できるだけでつまらないですね。それでは今回は、どのプログラム言語でも必ず使われている「変数」にいて勉強しましょう。はっきり言って、変数を知らなければ何もできません。プログラムの柔軟性はこの変数のうまい使い方によって決まってきます。

 変数は、数値を記録するために使います。数学で言う変数とは違います。たとえば電卓で何か数字を押して「M+」を押すと、その数値が記録され、「MR」を押すと記録した数値が出てきますね。変数はちょうどその電卓のメモリーのようなものです。値を取っておくものに他なりません。

 しかし何が何でも記録できるわけではなく、ちゃんと記録できる種類があります。その種類のことをと言っています。以下にその型を表にしたので見てください。

型の名前 説明
文字型 char 8bits(8bits = 1byte)の文字を扱う。漢字は16bitsだからだめ。
整数型 int 扱うコンピュータのCPUやコンパイラによって変わる。普通は16か32bitsで、整数値を表すのに一般的に使われる。
short 短い整数値を扱う。普通は16bits。
long 長い整数値を扱う。普通は32bits。
浮動小数点型 float 実数を扱う時はこれを使う。普通は32bits。
double floatよりも有効桁数の多い型。普通は64bits。

 ん〜あんまりピンとこないですね。こういうときは実際に使ってみましょう。これをある方は「論よりソース」と言うらしいです(^_^;。以下のソースコードを見てください。

#include <stdio.h>

main()
{
    int i1;
    int i2;

    i1 = -100;
    i2 = i1;

    printf("%d\n", i2);
}

 変数を使うときは、まず最初に「{」の直後で

  1. 何型の変数を使うか
  2. それはどういう名前なのか

を明確にしておかなくてはなりません。これを明確にすることを変数の宣言と言います。この例では、i1,i2という名前のint型の変数を宣言(つまり整数を記憶できるi1,i2というメモリーを用意)しています。

 そして、宣言した変数に値を記憶させるには「=」を使います。この例では、まず「i1 = -100;」でi1に-100という数値を記憶させています。次になんと「i2 = i1;」としています。これはどういうことになるかというと、i2にi1の内容を記憶させることになります。つまりi1には、直前に-100という数値が入っているので、i2にも-100が入ることになります。

 ところで、その変数の中身がどうなってるかを私達が知る方法をまだ知りませんよね。それを知るには、前に文字や数値を表示するのに使ったprintf関数が使えます。このように変数を指定すると、変数の中身を読んできて、表示してくれます。

 実行結果はもう分かりますね。もちろん、「-100」が表示されます。

 このprintf関数の「%」の使い方についてもっと知りたい人は、ここを押してください。

 

変数を使って計算をする

計算結果を代入する

 さあ、もうちょっと話を進めてみましょう。欲のある方は、もう「i1とi2を足した数値をi3に入れられたら...」と思っているかもしれません。実は、簡単にできてしまうんです。

#include <stdio.h>

main()
{
    int i1, i2, i3;

    i1 = 10;
    i2 = 20;

    i3 = i1 + i2;

    printf("%d\n", i3);
}

 あ、何も言わずに「int i1, i2, i3;」と書いてしまいましたが、同じ型の変数をたくさん宣言するとき、こういう書き方もできるんです。この方が楽ですよね。

 さて、このプログラムを実行すると、画面には何が出てくるでしょうか。直感的に分かりますね。そう、「30」という数字が画面に出てきます。

 このように計算した結果を変数に代入することもできます。C言語では、この「+」の事を演算子と言い、特にこのような、足したり掛けたり計算に使う演算子を算術演算子と言います。まぁ、そういう名前がついている程度の認識でかまいません。以下に算術演算子の表を書いておきます。

a+b aとbを足す
a−b aからbを引く
a*b aとbを掛ける
a/b aをbで割る
a%b aとbで割ったときの余り

 「i1 = i2+i3*i4」等と書くこともでき、この時は以前説明したように、四則演算に基づいて「i3*i4」がはじめに計算されて、その後にi2が足されます。括弧を使って優先順位を変えることもできます。「i1 = ((i2+i3)*i4+i5)*i6」というように、括弧を何重にもすることができます。

「=」は等号ではない

 ところで、このプログラムの場合、どうなると思いますか?

#include <stdio.h>

main()
{
    int i = 100;

    i = i + 50;

    printf("%d\n", i);
}

 あ、また何も言わずに「int i = 100;」等と書いてしまいましたが、最初から変数に入れる数値が分かっている場合、このようにして宣言と同時にiを100で初期化してしまうことも可能です。ところで...

 もしあなたが「i = i + 50;」をあたかも数学の等式のように見てしまっていたら、この例は異様に感じるはずです。しかし、これはプログラムとして立派になりたち、またよく使われるので、特別に「i += 50;」という書き方を許されているほどです。これは次のように手順立てて考えてみれば納得できます。

  1. まず、「i + 50」が処理されます。
  2. iには100が入っています。
  3. つまり、「100 + 50」という意味になります。
  4. この式は「150」という値を持つことになります。
  5. この値が再びiに入ります。
  6. つまり、iには「150」という値が入ります。

 よって、画面には「150」が表示されます。(もし、この「i = i + 50;」を連続して実行させた場合、iの値は50ずつ増えていくことになります。このテクニックはのちのち役に立ちます)

 この例の場合、「i += 50;」と書くことができることはもう言いましたが、特に「i += 1;」の時はさらに特別な書き方が許されていて、「i++;」と書くことができます。もちろん引き算もあって「i--;」という書き方もできますが、残念ながら「i**;」等はありません(考えてみれば当たり前なんですが)。これらのことをインクリメント・デクリメント演算子と言います。

 

定数の種類

8進数、16進数

 さて、何気なく「i1 = 10;」などと書いてしまっていますが、この「10」にも立派な名前があります。その名も「定数」。.....当たり前ですね。だけど、ちょっと気をつけなきゃいけません。「i1 = 10;」と「i1 = 010;」、同じもののように見えますが、まったく違います。後者は「8」が代入されてしまいます。実は、「0」を先頭に書くと8進数とみなされます。また、「0x」を先頭につけると16進数とみなされます。だから、「i1 = 10;」は、「i1 = 0xA」と書いても同じ事になります。

文字

 次に、「'A'」のように一重引用符「'」で1バイト文字を囲むと、文字コードを表現することになります(1バイト文字は内部では0から255までの数値として表現されています)。この値は、char型です。このようにわざわざ文字コードを調べなくても、下の例のようにして直接文字を書いて使うことができます。応用すると「'\n'」もアリです。これは改行コードを表現しています。しかし「'悪'」これはだめです。2バイト文字だからです。

 逆に文字コード(char型)から文字を表示することができます。printf関数で「%c」を指定すると、数値に対応した文字が表示されます。

#include <stdio.h>

main()
{
    char c;

    c = 'A';

    printf("%c\n", c);
}

 この例では、変数cに‘A’の文字コードが入り(文字ではなく数値が入ります)、printf関数でその文字コードに対応する文字を表示しています。そのため、画面には「A」が表示されるわけです。

整数/実数

 以前述べたように、「10」と、「10.0」も大きな違いです。後者の「10.0」は整数ではなく実数とみなされます。しかし「i1 = 10.0」としても、i1には「10」という整数値が入ります。ここら辺の話はちょっと深いので、今は深くは触れません。

 

まとめ。

  1. 変数とは、電卓のメモリーのようなもの。
  2. 変数にはがある。
  3. 変数は最初に使う前に宣言をしなくてはならない。
  4. 「=」を使って、変数に代入することができる。
  5. printf関数を使って、変数の内容を知ることができる。
  6. 「+」等を使って演算することができる。計算方法は四則演算に基づいている。
  7. 8進数、10進数、16進数等で数値を表現できる。
  8. 文字コード調べなくても「'」で囲んで直接文字を書くことができる。

(1997/01/30, 1999/03/13 改)

[目次へ] [次へ]

 著作権は全て小出 俊夫にあります。KID's World © 1996-2003 Toshio Koide.

 対応ブラウザについて