前節では、#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は、他に関数の引数の型として使われることもあります。
これは、配列を渡す時に、その値を変更させないためです。
この点についての説明は後回しとさせていただきます。
C言語には、#defineやconstの他に、enum(エナム)定数があります。
enum定数の宣言の仕方は次の通りです。
enum定数では、数値を指定する必要はなく(指定することも出来る)、enum { 名前, 名前, 名前 };
自動的に数値がつけられるのでは、定数として利用出来ないようにも思えますが、
enum定数は、主にフラグ定数として使用されます。
例えば、RPGゲームにおいて、キャラの状態を表す場合、
0 正常のように番号をつけて区別する必要がありますが、これを直接数値で区別すると、
1 毒
2 マヒ
3 呪われ
のようにして名前で表すことが出来るので、わかりやすくなります。#define STATE_NORMAL 0 /* 正常 */ #define STATE_POISON 1 /* 毒 */ #define STATE_NUMBLY 2 /* マヒ */ #define STATE_CURSE 3 /* 呪われ */
この様に便利なenumですが、残念なことに、enumは整数値しか扱えません。enum { STATE_NORMAL, /* 通常 */ STATE_POISON, /* 毒 */ STATE_NUMBLY, /* マヒ */ STATE_CURSE /* 呪われ */ };
[ 最後の, ]
enumの名前の後につける,は、正式には最後の名前にはつけませんが、
実際にはつけてもほとんどの場合には問題なく動作するので、
次のようにして書くと、名前の追加や修正が楽になります。
ただし、組み込み向けコンパイラなどでは動かないこともあるようです。enum { STATE_NORMAL, STATE_POISON, STATE_NUMBLY, STATE_CURSE, /* ここにも,がある */ };
enum定数では、数値を省略出来ますが、必要であれば指定することも出来ます。
enum定数の宣言の仕方は次の通りです。
次は、数値を指定したenum定数の例です。enum { 名前 = 数値, 名前 = 数値, 名前 = 数値 };
数値を省略した場合、1番先頭の名前を0として、以後は1ずつ増やした値がつけられます。enum { ENUM_0, ENUM_1, ENUM_5 = 5, ENUM_6, ENUM_7, ENUM_9 = 9, };