実行中は変化しない値を定数と呼びます。
これまで、プログラム中に直接書き込んできた数値は、全て定数です。
直接書き込まれた文字列も定数で、文字列リテラルと呼ばれます。
プログラム中では、何度も同じ数値や文字列を使うことがあります。
例えば、円周率は約3.14159であり、この値はいついかなる時でも同じです。
この様に、同じ値や文字列を何度も書くのは無駄です。
また、その数値や文字列を変更する必要が生じた場合、修正が面倒です。
例えば、消費税を計算する機能の付いた電卓ソフトがあった場合に、
突然、消費税が3%から5%になったとしたら、
プログラム中の0.03という数値を全て0.05に書き換えなければなりません。
もしかしたら、消費税とは別の意味の0.03があるかもしれないので、
それを間違って変更しないよう、1つ1つ確認しながら書き換えるのは大変です。
そこで、あらかじめ数値に名前をつけて、その名前を使うようにします。
名前をつけた部分を修正するだけで、全ての数値が修正されますし、
名前で書かれていれば、ただの数値よりも意味がわかりやすくなります。
C言語には、数値に名前をつける方法が用意されています。
それが、#define(ディファイン)疑似命令です。
#define疑似命令の使い方は次の通りです。
まず、#define疑似命令では、文の終わりに;をつけてはいけません。#define 名前 数値
このプログラムを実行して、300を入力した場合の結果は次の通りになります。#include <stdio.h> #define EXCISETAX 0.03 /* ここで定数を宣言 */ int main(void) { int price; printf("本体価格:"); scanf("%d",&price); price = (int)((1 + EXCISETAX) * price); /* 定数使用 */ printf("税込価格:%d\n",price); return 0; }
このプログラムでは、数値計算に#define疑似命令による定数を使っています。
本体価格:300 (入力値)
税込価格:309
この式では、EXCISETAX を置き換えた数値 0.03 が実数値なので、
計算結果も実数値になるのですが、普通は価格に実数は使わないので、
int型にキャスト(変換)して代入しています。
#define文の数値を変更すれば、プログラム中の数値も変わります。
次のプログラムは、消費税を 0.05 に変更した場合の先頭部分です。
このプログラムを実行して、300を入力した場合の結果は次の通りになります。#define EXCISETAX 0.05 /* ここで定数を宣言 */
この様に、定数を使うと数値の意味がわかりやすくなり、修正が容易になります。
本体価格:300 (入力値)
税込価格:315
#define疑似命令では、数値だけでなく、文字列にも名前をつけられます。
使い方は、数値の場合と同じですが、文字列には、当然""をつける必要があります。
次のプログラムは、プログラムの作者名を表示します。
このプログラムの実行結果は、次の通りになります。#include <stdio.h> #define AUTHOR "森口将憲" int main(void) { printf("作者名:%s\n",AUTHOR); return 0; }
ここでも、AUTHOR は "森口将憲" に置き換えられます。
作者名:森口将憲