苦しんで覚えるC言語

その他の方法による定数


const定数


前節では、#defineを使って定数を宣言する方法を説明しましたが、
C言語には、他にも定数を宣言する方法があります。
その1つは、const(コンスト)定数として宣言する方法です。

const定数とは、値を変更出来ない変数のことです。
変数を宣言する時、その先頭でconstを指定すると、
その変数は宣言時に代入された初期値を変更することが出来なくなります。
次のプログラムは、前節の消費税プログラムをconst定数に書き換えた例です。

#include <stdio.h>

int main(void)
{
	const double EXCISETAX = 0.05;
	int price;
	printf("本体価格:");
	scanf("%d",&price);
	price = (int)((1 + EXCISETAX) * price);
	printf("税込価格:%d\n",price);
	return 0;
}
実行結果は、前節と全く同じになります。

constをつけて宣言された変数には代入が出来ません。

EXCISETAX = 0.03;
のような文を追加するとエラーとなります。それ以外は、通常の変数と全く同じです。

const定数は、定数として使う限りは#defineとほとんど同じです。
一般的には、定数を宣言する時には#defineを使用することがほとんどですが、
特定の関数の中だけで使用する定数を宣言したい時などには便利です。
定数を配列の要素数にする
C言語では、const定数を配列の要素数に出来ませんが、
C++やC99では可能になっています。
なお、#define疑似命令ならどちらでも可能です。
constの使い道
constは、他に関数の引数の型として使われることもあります。
これは、配列を渡す時に、その値を変更させないためです。
この点についての説明は後回しとさせていただきます。

目次に戻る

enum定数


C言語には、#defineやconstの他に、enum(エナム)定数があります。
enum定数の宣言の仕方は次の通りです。

enum {
	名前,
	名前,
	名前
};
enum定数では、数値を指定する必要はなく(指定することも出来る)、
名前だけで自動的に数値がつけられるので、大量の定数を宣言する場合に便利です。

自動的に数値がつけられるのでは、定数として利用出来ないようにも思えますが、
enum定数は、主にフラグ定数として使用されます。
例えば、RPGゲームにおいて、キャラの状態を表す場合、

0 正常
1 毒
2 マヒ
3 呪われ
のように番号をつけて区別する必要がありますが、これを直接数値で区別すると、
どれがどれだかわからなくなってとても不便です。
そこで、#define文を用いれば、

#define STATE_NORMAL 0 /* 正常 */
#define STATE_POISON 1 /* 毒 */
#define STATE_NUMBLY 2 /* マヒ */
#define STATE_CURSE 3 /* 呪われ */
のようにして名前で表すことが出来るので、わかりやすくなります。
しかし、この場合、数値それ自体には意味がなく、ただ区別出来れば良いだけですから、
次のようにenumで自動的に番号を振らせた方が楽で良いのです。

enum {
	STATE_NORMAL, /* 通常 */
	STATE_POISON, /* 毒 */
	STATE_NUMBLY, /* マヒ */
	STATE_CURSE /* 呪われ */
};
この様に便利なenumですが、残念なことに、enumは整数値しか扱えません。
実数値を扱う場合には、#defineかconst定数にするしかありません。
また、文字列も扱えません。
最後の,
enumの名前の後につける,は、正式には最後の名前にはつけませんが、
実際にはつけてもほとんどの場合には問題なく動作するので、
次のようにして書くと、名前の追加や修正が楽になります。
enum {
	  STATE_NORMAL,
	  STATE_POISON,
	  STATE_NUMBLY,
	  STATE_CURSE, /* ここにも,がある */
};
ただし、組み込み向けコンパイラなどでは動かないこともあるようです。  
目次に戻る

数値指定enum定数


enum定数では、数値を省略出来ますが、必要であれば指定することも出来ます。
enum定数の宣言の仕方は次の通りです。

enum {
	名前 = 数値,
	名前 = 数値,
	名前 = 数値
};
次は、数値を指定したenum定数の例です。

enum {
	ENUM_0,
	ENUM_1,
	ENUM_5 = 5,
	ENUM_6,
	ENUM_7,
	ENUM_9 = 9,
};
数値を省略した場合、1番先頭の名前を0として、以後は1ずつ増やした値がつけられます。
どこかで数値を指定した場合、そこは指定した数値、以後は1ずつ増やした値になります。
上の例では、先頭から、0,1,5,6,7,9、の順番に数値がつけられます。

目次に戻る