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

先頭へ戻る

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

この章の概要

この章の概要です。

変数

今回は、変数について説明します。

変数とは、名前の通り「変化する数」です。 プログラムを実行している最中のある時点で 100 という数だったものが、他のある時点では 200 になっているかもしれない。そういう数です。 「数」という表現をしましたが、実際には数に限らず、文字の場合もあり得ます。

変数のイメージは、「値を入れておく箱」です。 プログラム中では、この箱を作り、その中に値を入れておきます。 箱への出し入れは、基本的に、いつでも何度でも可能です(「基本的に」というのは、場合によって箱が見えない場所に置かれていることがあり、 その場合には出し入れできないということですが、これは第22章で説明します)。

さて、変数を使うには、まず宣言という行為を行う必要があります。 宣言とは、「これからこういう変数を使いたい」という意思表明をするということです。 変数を宣言する際には、変数の名前を指示します。

正確に用語を使うのなら、宣言を行った時点ではまだ、前述のような「箱」は作られていません。 箱が作られるのは、変数の定義を行う段階です。 この章で説明する範囲でいえば、宣言をするのと同時に定義も行ったことになるため、あまり深く考える必要はありませんが、 一応、宣言と定義は別物で、箱が作られるのは定義のときです。

変数の型

変数の型というのは、どのような種類の値を入れることができるのかという指定です。整数とか小数とか、文字とか、そういう意味です。 具体的には、次のような指定ができます。

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

int の変数を宣言したら、その変数は「int型の変数」と呼ばれます。 int型の変数の場合、整数しか入れることはできません。 ですから、使用用途に合った型を選択する必要があります。

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

float型 double型は、ともに実数を扱う型です。
ここでいう「実数」とは、 C言語の規格で定められた意味合いのものであり、数学での定義とは異なります。 要するに、整数以外の数値のことを実数と言っています。 それは結局のところ、いわゆる小数です。

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

単に「小数」と言った場合、それは小数点を含む数の "表記方法" を意味しているので、 厳密には「整数と小数」と対比させるのは「数と表記方法」を対比させていることになるので不適切です。

実数は、無限に桁が続く可能性があるので、コンピュータではこれを近似的に表現する手段が必要です。 この表現方法の一種として、浮動小数点数というものがあり、C言語ではこの方法が使われています。

float型と double型の違いは、扱える数の精度にあります。 コンピュータが小数を表現する仕組みからいって、どうしても誤差が発生してしまうのですが、double型の方がやや正確に数を表現できます。 基本的には、double型だけを使うようにして問題ありません。

変数の名前

宣言の際に必要なもう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 は変数の名前です。

ちなみに、num は numeric という英単語の略で「数値」という意味です。 このような名前は、サンプルプログラムでよく使われますが、あまり分かりやすい名前の付け方とは言い難いです。 本当は、その変数がどんなことに使われるのかを表すような名前を付けるべきです。

続いて、「num = 100;」という部分です。 変数のイメージである「箱」を作った時点では何も入っていない訳ではなく、何かよく分からないものが入っています。 int型で何も値を入れていなければ 0 が入っていそうな感じもしますが、そうではありません。 このような、何か分からない値を不定値と呼びますが、この状況では、どんな仮定も成り立ちません。

ですから、具体的な(正しい)値を入れてやる必要があります。 これが「num = 100;」という操作で、この記述により、変数num に 100 が入ります。 この操作を代入と呼びます。 代入を行うと、それまでに変数に入っていた値は消えてなくなり、新しい値に書き変わります。つまり、上書きしたことになります。

最後に printf関数ですが、今回は数字を出力したいので、 前章とは異なる手法が必要になります。 printf関数に指定する文字列の中に "%d" という不思議な文字を入れると、その部分を別の数字で置き換えることができます。 この機能を使って、「printf( "%d\n", num );」と書けば、%d の部分には、変数num の値が埋め込まれます。 ここで、printf関数の %d のような特殊な文字を、変換指定子と呼びます。 %d以外にも幾つかありますが、その中で %d は整数を出力するためのものです(より正確には 10進数の整数です)。 整数以外には使用できません。

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

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


なお、整数以外を埋め込みたいときには、以下の指定が使えます。

フォーマット指定 意味
%f 浮動小数点数
%c 文字
%s 文字列

これで全てではありませんが、とりあえずはこれだけあれば当面は大丈夫でしょう。 また、「\」「%」「"」は、printf関数を使う際に別の意味で登場する特殊な文字ですから、これらの文字を出力させるには、 「\\」「%%」「\"」という特殊な書き方をする必要があります。

変数の初期化

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

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

#include <stdio.h>

int main(void)
{
	double d = 3.5;
	
	printf( "%f\n", d );

	return 0;
}

実行結果:

3.500000

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

実行結果では、小さい桁の 0 が幾つか出力されていますが、この辺りはコンパイラによって多少異なるかも知れません。 なお、float型や double型のような浮動小数点型を printf関数で出力するには、"%f" という指定を使います。


練習問題

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

問題A 変数の初期化を行わずに、printf関数で値を出力してみて下さい。

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


解答ページはこちら

参考リンク

更新履歴

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

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

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

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

'2008/9/15 新規作成。



前の章へ

次の章へ

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

Programming Place Plus のトップページへ