Tips

C言語 定数 【基礎 第5回】

◆記号定数

先ほどまでの定数はコードに書いた数値や文字でしたが、これら以外にも
記号定数や列挙型定数というものがあります。記号定数というのは定数に名前をつけたようなものです。
コードに値などを直接書き込むと修正が困難な場合などに使用されます。
例えば、重力加速度を計算に使用するようなプログラムがあったとします。プログラム内で浮動小数点定数として
9.8という値を頻繁に使用してあったものが開発途中でもう少し正確に9.80665という数値を使うように変更になると
これまで9.8と書き込んでいた部分をすべて書き換えていくという手間が発生してしまいます。
そこで9.8という定数に名前を付けます。「GRAVITY 9.8」といった具合です。
そしてコード内で9.8という浮動小数点定数を直接書くのではなく、つけた名前を記述するようにします。
そうすることで定数に変化があったとしても名前に対応した定数の値を変更するだけで済みます。

記号定数を使用するには「#define」とディレクティブを使用します。
「#define A B」のようにします。こうすることでソースコード上のAがBに置き換えられます。

#define GRAVITY 9.8
int main(void){
	int t = 2;
	printf(“自由落下速度%fn”,GRAVITY*t);
	printf(“落下距離%fn”,t*t*GRAVITY/2);
	return(0);
} 

一行目で「#define」を使用してGRAVITYが9.8に置き換わるように定義しています。これによりコード内の「GRAVITY」が
コンパイル前に9.8に置き換えられます。
こうすることで9.8が9.80665に変更になっても1行目を変えるだけで済みます。
また9.8と書くよりも重力加速度の計算をしようとしているというのが伝わりやすいというのもあります。

列挙型定数

列挙型というのは、定数の集合体を作成するようなものです。
CCNAは「1」、LPICは「2」、MCPは「3」といったように定義していくものです。先ほど出てきた「#define」ディレクティブを
使用しても同じことができますが、1つごとに定義するする手間が省けます。列挙型を宣言する際は「enum」を使用します。
構文は以下のようになります。

enum タグ名 { 列挙定数, 列挙定数, 列挙定数}

タグ名には他の列挙型と区別するための識別名をつけます。そして「{」「}」の間に、定義する定数を書きます。
この時定数に値を指定していませんが、自動で先頭が「0」となり、後ろに続く定数は+1していった値となります。
また列挙定数に以下のようにすることでそれぞれ値を指定することもできます。

enum タグ名 { 列挙定数 = 1, 列挙定数 = 2, 列挙定数  = 4}

また「enum タグ名」で1つの型として扱われます。「enum タグ名 変数名」とすることで列挙型の変数を宣言することも
できます。

コードで確認
#include <stdio.h>
enum course {CCNA = 1, LPIC, MCP, PROGRAM_C};
int main(void){
	enum course select = PROGRAM_C;
	printf("あなたの選択科目は%dn",select);
	return (0);
}

列挙型の「course」を定義しています。以下のように指定しても同様のことになります。ただ関連するものを
まとめて数値を自動で割り振れるという点では列挙型のほうが使いやすいかもしれません。

#define CCNA  1
#define LPIC 2
#define MCP 3
#define PROGRAM_C 4	     

「enum」の構文を見てみるとCCNAだけ1が定義されていますが、
後ろには定義されていません。
このときどういった挙動になるかというと値の指定があったところの後ろの列挙定数は指定された値から+1される値に
設定されます。
LPICは自動的に「2」となり、MCPは「3」、PROGRAM_Cは「4」となります。
実行結果は以下のようになります。
~~~~実行結果~~~~
あなたの選択科目は4
~~~~~~~~~~~~

◆const修飾子

宣言した変数を値の変えられないものとすることで定数とすることが
できるようになっています。「const」修飾子を使用します。「const」の使い方は以下のようになります。

const double excise  = 0.05;

このように宣言した場合、以後変数「excise」の値は変更できません。以下のコードで見てみましょう。

コードで確認
#include <stdio.h>
int main(void){
	const double excise = 1.05;
	excise = 1.10;		//コンパイルエラーとなります。
	printf(“支払いは税込みで%dnです。”,5000 * excise);
	return (0);
}

前頁のコードを実行すると4行目のところでエラーがでます。
「const」をつけて宣言した変数exciseの値を変更する処理になっているからですね。
変数の宣言時に初期化した値からは変更できなくなります。
そのため宣言時に初期化していないと値が不明のままとなってしまいますので気を付けなければなりません。

const double excise;

上記のような宣言をしてしまうと値の変更ができなくなるので使いものになりません。

「const」を使用することで書き換えの禁止を行うことができるため、不用意な変更などからデータが
守られることになります。
のちに出てきますが文字列を操作する関数では「const」を引数に指定されていることが多くあります。

実践力が身につくC言語講座 連載リンク

競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載

アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載

パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載

Recent News

Recent Tips

Tag Search