C言語のシンボリック定数とは?マクロとの関係をやさしく解説!初心者でも安心の基本ガイド
生徒
「C言語のプログラムの中で、数字をそのまま書いているコードをよく見るんですけど、読みづらいと感じます。」
先生
「その気持ちは大事ですよ。同じ数字を何回も使うと、あとで変更も大変になりますし、意味も分からなくなります。」
生徒
「もっと分かりやすくする方法ってあるんですか?」
先生
「あります。それがシンボリック定数です。C言語ではよくマクロと一緒に使われます。これから詳しく説明していきましょう。」
1.シンボリック定数とは?
シンボリック定数とは、数字の代わりに名前をつけて使える定数のことです。プログラムの中で数値を直接書くと、その数字が何を意味するのか分かりづらくなります。例えば、1年を秒で表すと「31536000」という大きな数字になりますが、これをそのまま書くと非常に読みづらいです。
しかし名前をつければ、意味がはっきりします。
#define ONE_YEAR_SECONDS 31536000
こうすることで、後からコードを読んだ人にも何を表しているかが分かりやすくなります。これがシンボリック定数の大きなメリットです。
2.マクロとシンボリック定数の関係
C言語でシンボリック定数を作るときは、多くの場合#defineという機能を使います。#defineはマクロと呼ばれる仕組みのひとつで、コンパイルの前に決まった文字列を置き換える役割を持ちます。
マクロを使うと、プログラム中で同じ数字を何回も書く必要がなくなり、ミスも減ります。
#define TAX_RATE 0.1
int main() {
int price = 100;
int tax = price * TAX_RATE;
return 0;
}
TAX_RATEという名前を使うことで、数字の意味が明確になります。もし税率を変更したければ、#defineの一箇所を変えるだけで済みます。
3.数字を直接書くとどうなる?
例えば、プログラムに同じ数字が10か所あったとします。その数字を変更するとき、全部探して書き換えなければいけません。もし1か所でも書き換え忘れると、思わない動作になることもあります。
シンボリック定数を使えば、名前を変更するだけで済むので、非常に安全です。
#define MAX_USER 5
こうしておけば、プログラムの中でMAX_USERと書くだけで済みます。名前なので読みやすく、変更にも強いプログラムになります。
4.シンボリック定数は型を持たない?
マクロで作ったシンボリック定数は、実は型を持ちません。コンパイル前に単なる文字置き換えとして扱われます。
つまり
#define NUMBER 10
と書いても、NUMBERは整数型ではなく、単に「10」という文字に置き換えられます。この違いは、C言語を深く学ぶときに役立ちます。
5.constとの違いも知っておこう
シンボリック定数と似た仕組みにconstがあります。constは「値を変更させない変数」を作る仕組みです。
const int MAX_VALUE = 100;
MAX_VALUEは整数型の定数として扱われます。しかしマクロと違って、型が存在します。メモリ上にもデータとして存在するので、デバッグ(動作確認)のときに扱いやすいことがあります。
ただし、C言語では多くの場面で#defineを使ったシンボリック定数が利用されています。これは歴史的な理由もあります。
6.よく使うシンボリック定数の例
シンボリック定数は、現実の意味を数字に与える場面に役立ちます。例えば、方向を数字で管理するプログラムがあるとします。
#define UP 0
#define DOWN 1
#define LEFT 2
#define RIGHT 3
数字のまま使うと「0は上?1は下?」と覚える必要がありますが、名前があれば一目で意味が分かります。
7.シンボリック定数でバグが減る理由
数字を直接書くと、人間は思い違いをしたり、打ち間違えることがあります。しかしシンボリック定数はキーボードで名前を打つだけなので、行動に間違いが起きにくくなります。
また、プログラムを初めて読む人、後から修正する人にとっても分かりやすいコードになります。プログラムの世界では、読みやすいコードがとても価値のあるものとされています。
8.シンボリック定数とマクロはC言語の基本
C言語は細かい制御ができる反面、記述を間違えると大きなバグにつながります。だからこそ意味をはっきりさせることが重要です。
マクロによるシンボリック定数は、初心者でも必ず覚えておくべき基本です。数字に意味を持たせるだけで、C言語のプログラムは読みやすく、安全なものになります。