C言語編 第3章 変数を宣言する

先頭へ戻る

このエントリーをはてなブックマークに追加

この章の概要

この章の概要です。

変数

この章では、変数について説明します。

変数とは、名前の通り「変化する数」です。 プログラムを実行している最中のある時点で 100 という数だったものが、他のある時点では 200 になっているかもしれない。 そういう数です。

「数」という表現をしていますが、実際には、文字など、数以外の場合もあります。 そこでまとめて、「値(あたい)」という言葉を使います。 100 も「a」のような文字も、全部まとめて「値」と呼ぶということです。

変数を視覚的にイメージするとすれば、「値を入れておく箱」ということになります。 ソースコード上に、この箱を用意させる記述しておけば、プログラムの実行時に、その箱が実際に使用できるようになります。

先程、冒頭部分の説明の中で、「100 だったものが 200 になっているかもしれない」という表現をしました。 箱の話に直すと、「箱の中に入っていた 100 という値が、あるタイミングで 200 に変わっているかもしれない」ということです。 箱の中身は、基本的には自由に出し入れすることができます。いつ出し入れするのか、どんな値を入れるのかは、 もちろん、プログラムを書くあなたが決めることです。

宣言と定義

変数を使うにはまず、宣言という行為を行う必要があります。 宣言とは、「これからこういう変数を使いたい」という意思表明をするということです。 もちろんこれは、ソースコード上に、C言語の文法ルールに従って記述するのです。

変数を宣言するときには、変数のと、変数の名前を指定します。 それぞれ、この後の項で詳細に説明します。

冒頭で登場した「箱」で考えると、変数の宣言とはいわば、箱を注文するということです。 「こういうものが入れられる箱が欲しい」という注文です。 まだ箱を注文している段階なので、実際に「箱」が存在する訳ではないということになります。 実際に箱が使えるようになるのは、変数の定義を行ったときです。

コンピュータ寄りの言い方をすると、定義を行ったときに、メモリという場所に、値を保存するための領域が取られます。

宣言と定義を具体的にどうやるのかは、この後説明します。

変数の型

変数には、「(かた)」があります。 型とは、どのような種類の値を入れることができるのかという指定です。 つまりは、整数とか小数とか、文字とか、そういった区別です。

具体的には、次のような指定ができます。

扱える値
int 整数
char 文字(文字列ではない)
float 浮動小数点数
double 浮動小数点数(float よりも高精度)

例えば、型として「int」を選んだとすると、その変数は「int型の変数」と呼ばれます。 int型の変数の場合、整数しか入れることはできません。

char型の変数の場合、文字を1文字だけ入れておけます。 1文字だけというのがポイントで、2文字以上ある文字列をは入れることはできません。 C言語において、文字列の表現はなかなか難しいものなので、 当分の間、文字列の変数は扱わないことにします(文字列の変数については、第25章で説明します)。

float型 double型は、 ともに浮動小数点数を扱う型です。 単に、小数と言いたくなりますが、これは正確とは言えません。

小数点以下には、桁が無限に続く可能性があります。 そのため、コンピュータで表現するには、近似的な表現方法が必要です。 表現方法の一種として、浮動小数点方式というものがあり、浮動小数点方式で表現された数のことを、浮動小数点数といいます。

浮動小数点方式は、その仕組みの都合上、どうしても誤差が発生します。 表現の精度が高いほど、正確に数を表現することができるのですが、 その精度の違いが、float型と double型の違いです。
例えば、「0.1」という数を扱いたくても、コンピュータの表現力では正確に表現できないかも知れません。 float型では「0.100000024」のようになり、double型では「0.10000000000000007」のようになり得るということです。 どちらかといえば、double型の方が正確な値に近いですが、いずれにしても、正確では無いということです。 とはいえ、正確に近い方が計算のトラブルが少ないですから、基本的には、double型だけを使うようにして問題ありません。

ただし、float型の方が、使うメモリの大きさが小さく済みます。 また、float型の方が計算が高速である可能性もあります(こちらは環境によるところが大きいので、一概には言えません)。

なお、浮動小数点数という言葉の代わりに、実数と表現することがありますが、 これは非常にややこしい問題を含んでいるので、C言語では、浮動小数点数と表現した方が良いと思います。
C言語では、int型のように整数を扱う型と、float型のように浮動小数点数を扱う型をまとめて、 実数型と呼んでいます。 これはつまり、C言語で「実数」といった場合には、整数も含まれているということです。 これは数学における「実数」とは明らかに異なっています。

数学での実数は、有理数を無理数を含めた数とされています。 有理数の中には整数が含まれているので、この点で、C言語での実数とは異なります。

浮動小数点数にまつわる話題の詳細はかなり難しいので、ここでは触れませんが、 ともかく、「浮動小数点数は正確に表現できないことがある」という点は記憶に留めておいて下さい。

変数の名前

変数を宣言する際に必要になる、もう1つの情報が、変数の名前です。 変数名と呼ぶことも多いですが、より正確には識別子といいます。

名前が必要な理由は、変数を複数宣言したときに、それぞれの区別を付けられるようにするためです。

変数の名前は、以下の規則にさえ従っていれば、自由に付けられます。

また、コンパイラが定めている文字数の上限があるかも知れませんが、 実用上問題になるほど厳しい上限設定にはなっていないはずです。

小文字と大文字は区別されるという点に注意して下さい。 例えば、abc と ABC では別の名前です。 プログラミング言語の種類によっては、区別しないものもあるので、そのような言語の経験者は特に注意が必要です。

記号として、アンダーバー(_) だけが使えるのが不思議かも知れませんが、 他のほとんどの記号には別の用途があるので、名前には使えません。 _ は主に、長い名前を付ける際の単語の区切りに使います。 なお、_ を名前の先頭に付けることは、許可されてはいますが、避けるべきです

先頭が _ の名前は、コンパイラそのものの実装のために予約されているため、 万が一、同じ名前が使われると混乱を招くことになります。

既に他の用途で使われている名前の中には、予約語と呼ばれるものがあります。 これはC言語側が使っている言葉という意味です。 これまでに登場したものでいえば、return、int、char、float、double、void が予約語です。

変数の名前は、後でソースコードを見直したときにも、どのような用途で使っているのかが分かりやすいように付けるべきです。 この辺りは経験も必要ですが、意識していくようにしましょう。

変数を使う

それでは、変数を使ったプログラム例を見てみましょう。

#include <stdio.h>

int main(void)
{
    int num;

    num = 100;
    printf( "%d\n", num );

    return 0;
}

実行結果:

100

main関数の1行目にある「int num;」の部分が、変数を宣言しているところです。 この記述により、int型で、名前が num という変数を宣言したことになります。

ちなみに、num は numeric という英単語の略で「数値」という意味です。 このような名前は、サンプルプログラムでよく使われますが、あまり分かりやすい名前の付け方とは言い難いです。 本当は、その変数がどんなことに使われるのかを表すような名前を付けるべきです。
例えば、「得点」を表しているのなら「score」のようにするということですが、 「英語の得点」と「数学の得点」が必要だったら「english_score」と「math_score」のように、 更に区別が付けられるようにする必要があるかも知れません。

変数が宣言された時点では、値が何も入っていない訳ではなくて、何かよく分からない値が入っています。 int型の変数なら、0 が入っていそうな感じがするかも知れませんが、そうではありません。
このような、何か分からない値を不定値と呼びます。

不定値が入っている変数から、値を取り出すようなプログラムは、人間が想像する通りの動作をさせることが不可能です。 ですから、変数にはきちんと、具体的な(正しい)値を入れてやるようにします。 これが「num = 100;」という部分です。この記述によって、変数 num に 100 という値が入ります。 「=」は「イコール」の記号ですが、 「同じ」というような意味はありませんから、記号に惑わされないようにして下さい。

このように、変数に値を入れる操作のことを、代入といいます。 代入を行うと、それまで変数に入っていた元の値は消えてなくなり、新しい値に書き変わります。 つまり、上書きしたことになります。

最後に、printf関数を使っていますが、今回は数字を出力したいので、 前章とは異なる記述が必要になります。
printf関数に指定する文字列の中に、"%d" という文字列を入れると、その部分を数字で置き換えることができます。 この機能を使って、「printf( "%d\n", num );」と書けば、%d の部分が、変数num の値で置き換えられるということです。 printf関数の "%d" のような特殊な指定は、変換指定子と呼びれています。 変換指定子は以下のように幾つかの種類があります。

変換指定子 意味
%d 整数
%f 浮動小数点数
%c 文字
%s 文字列

これで全てではありませんが、当面必要になるのはこれくらいでしょう。 完全なリストは、リファレンスを参照して下さい。

変換指定子は、一度に複数使うことも可能です。 例えば、「printf( "%d は %d の 10倍\n", 100, 10 );」のような記述も許されます。 この場合、最初に現れた "%d" に 100 が、次に現れた "%d" に 10 が埋め込まれます。

この機能は非常に便利で強力なものですが、使い方を誤ると大変です。 例えば、"%d" を 3回使っているのに、具体的な値の指定が 2個しかないと、最後の "%d" の扱いが不明確になり、 プログラムは正しく動作しません。

なお、「\」「%」「"」は、printf関数を使う際に別の意味で登場する特殊な文字ですから、 これらの文字を出力させるには、「\\」「%%」「\"」という特殊な書き方をする必要があります。

変数の初期化

先ほどの例では、変数を宣言した後で、値を代入していました。 このように、変数に、最初の具体的な値を入れることを、初期化といいます。 また、初期化するときに与える値を、初期値と呼びます。

実は、変数の宣言と初期化は、まとめて行うこともできます。

#include <stdio.h>

int main(void)
{
    double d = 3.5;

    printf( "%f\n", d );

    return 0;
}

実行結果:

3.500000

今回は double型の変数にしてみました。 変数d を宣言するのと同時に、初期値3.5 を与えています。 このように書けば、不定値が入った変数をうっかり使ってしまうミスを防ぐことができます。

なお、実行結果では、小さい桁の 0 が幾つか出力されていますが、この辺りはコンパイラによって多少異なるかも知れません。


練習問題

問題① 次のうち、変数名として使えないものを全て選んで下さい。

問題② 不定値を、printf関数で出力してみて下さい。

問題③ printf関数の "%d" 変換指定子を使って、浮動小数点数を出力するとどうなるか試してみて下さい。


解答ページはこちら

参考リンク

更新履歴

'2018/1/27 全面的に文章を見直し、修正を行った。

'2012/2/14 変数名のルールを修正。

'2011/2/11 printf関数の %d 以外のフォーマット指定と、「\」「%」「"」を出力する方法について記述を追加。

'2011/2/5 単に「小数」と表記していた箇所を、「実数」や「浮動小数点数」に改めた。

'2009/3/5 「この章の概要」を追加。

'2008/9/15 新規作成。



前の章へ

次の章へ

C言語編のトップページへ

Programming Place Plus のトップページへ