マクロ機能

不変の値の取り扱い

MMGames

マクロ、#define疑似命令



初めから終わりまで不変の値


実行中は変化しない値を定数と呼びます。
これまで、プログラム中に直接書き込んできた数値は、全て定数です。
直接書き込まれた文字列も定数で、文字列リテラルと呼ばれます。

プログラム中では、何度も同じ数値や文字列を使うことがあります。
例えば、円周率は約3.14159であり、この値はいついかなる時でも同じです。

この様に、同じ値や文字列を何度も書くのは無駄です。
また、その数値や文字列を変更する必要が生じた場合、修正が面倒です。

例えば、消費税を計算する機能の付いた電卓ソフトがあった場合に、
突然、消費税が3%から5%になったとしたら、
プログラム中の0.03という数値を全て0.05に書き換えなければなりません。
もしかしたら、消費税とは別の意味の0.03があるかもしれないので、
それを間違って変更しないよう、1つ1つ確認しながら書き換えるのは大変です。

そこで、あらかじめ数値に名前をつけて、その名前を使うようにします。
名前をつけた部分を修正するだけで、全ての数値が修正されますし、
名前で書かれていれば、ただの数値よりも意味がわかりやすくなります。


数値に名前をつける


C言語には、数値に名前をつける方法が用意されています。
それが、#define(ディファイン)疑似命令です。
#define疑似命令の使い方は次の通りです。

#define 名前 数値
まず、#define疑似命令では、文の終わりに;をつけてはいけません。
また、この文はプログラムの先頭に置くのが一般的です。
また、名前には変数と同じ文字が使えますが、大文字のアルファベットが一般的です。
次のプログラムは、本体価格を入力すると、税込価格を表示します。

#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;
}
このプログラムを実行して、300を入力した場合の結果は次の通りになります。

本体価格:300 (入力値)
税込価格:309
このプログラムでは、数値計算に#define疑似命令による定数を使っています。
税込み価格を計算する式の中で EXCISETAX と言う名前を使用していますが、
この名前は先頭の#define疑似命令によって 0.03 に置き換えられます。

この式では、EXCISETAX を置き換えた数値 0.03 が実数値なので、
計算結果も実数値になるのですが、普通は価格に実数は使わないので、
int型にキャスト(変換)して代入しています。

#define文の数値を変更すれば、プログラム中の数値も変わります。
次のプログラムは、消費税を 0.05 に変更した場合の先頭部分です。

#define EXCISETAX 0.05 /* ここで定数を宣言 */
このプログラムを実行して、300を入力した場合の結果は次の通りになります。

本体価格:300 (入力値)
税込価格:315
この様に、定数を使うと数値の意味がわかりやすくなり、修正が容易になります。


文字列に名前をつける


#define疑似命令では、数値だけでなく、文字列にも名前をつけられます
使い方は、数値の場合と同じですが、文字列には、当然""をつける必要があります。
次のプログラムは、プログラムの作者名を表示します。

#include <stdio.h>
#define AUTHOR "森口将憲"
int main(void)
{
	printf("作者名:%s\n",AUTHOR);
	return 0;
}
このプログラムの実行結果は、次の通りになります。

作者名:森口将憲
ここでも、AUTHOR は "森口将憲" に置き換えられます。
もちろん、#define疑似命令の部分を変更すれば、全ての AUTHOR に影響します。

サイト目次


第0部:プログラム概要編

  1. プログラムとは何か?

2章:プログラムの書き方

  1. 書き方のルール
  2. 書き方の慣習
  3. 練習問題2

3章:画面への表示

  1. 文字列の表示
  2. 改行文字
  3. 練習問題3

6章:キーボードからの入力

  1. 入力用の関数
  2. 入力の恐怖
  3. 練習問題6

9章:回数が決まっている繰り返し

  1. 繰り返しを行う文
  2. ループ動作の仕組み
  3. 練習問題9

10章:回数がわからない繰り返し

  1. 回数不明ループ
  2. 入力チェック
  3. 練習問題10

13章:複数の変数を一括して扱う

  1. 複数の変数をまとめて扱う
  2. 配列の使い方
  3. 練習問題13

20章:複数のソースファイル

  1. 最小限の分割
  2. 分割の定石
  3. 練習問題20