C言語の定数定義を完全解説!初心者でもわかるconstと#defineの違い
生徒
「C言語で数字や文字を何度も使いたいときに、毎回同じ数値を書くのは大変ですよね?」
先生
「その通りです。そんなときに便利なのが定数です。決まった値に名前を付けることで、後から読みやすくなり、間違いも少なくなります。」
生徒
「C言語では定数ってどんなふうに書くんですか?」
先生
「C言語ではconstと#defineという二つの方法があります。すこしややこしく感じるかもしれませんが、ゆっくり解説します。」
1. C言語における定数とは?
C言語の定数とは、プログラムの実行中に値を変更できない決まった値のことを指します。 見た目は変数に似ていますが、「途中で書き換えない」というルールがある点が大きな特徴です。 たとえば円周率や税率、人数の上限、ゲームの最大スコアなど、常に同じ意味で使いたい数値に名前を付けることで、 ソースコードの意味が分かりやすくなります。 数字だけが並んだコードよりも意図が伝わりやすくなり、後から見直したときにも理解しやすくなります。
プログラミング初心者にとっても、定数を使うことで「この値は変えてはいけない」というルールを コード上ではっきり示せるため、ミスを防ぐ助けになります。 小さなプログラムでも定数を意識して使う習慣を付けると、読みやすく整理されたコードを書けるようになります。
#include <stdio.h>
int main(void)
{
const int LIMIT = 3;
printf("回数の上限は%dです。\n", LIMIT);
return 0;
}
このサンプルでは、LIMITという定数を使って回数の上限を表しています。 数字を直接書く代わりに名前を付けることで、「何を表す数値なのか」が一目で分かります。 このように定数は、プログラムの意味を伝えやすくするための大切な考え方です。
2. constで定数を作る方法
constは、変数に「この値は変更しない」という意味を付けて、定数として扱う書き方です。
最大のポイントは、型があることです。整数ならint、少数ならdouble、文字ならcharのように、
データの種類がはっきりするため、C言語の基本である「型」を意識しながら安全に書けます。
プログラムの途中で値を変えてしまうミスを防ぎやすく、初心者でも読みやすいコードになりやすいのが特徴です。
#include <stdio.h>
int main(void)
{
const int TAX = 10;
printf("税率は%dパーセントです。\n", TAX);
return 0;
}
この例ではTAXが定数なので、あとから別の値を代入しようとするとコンパイルで指摘されます。
つまり、実行してから気づくのではなく、作っている途中で間違いに気づけるのが安心です。
「税率のように変わらない値」「上限や固定の数値」をconstで表すと、数字だけが並ぶより意味が伝わります。
#include <stdio.h>
int main(void)
{
const int LIMIT = 3;
int count = 1;
printf("上限は%d回です。\n", LIMIT);
while(count <= LIMIT)
{
printf("%d回目の表示です。\n", count);
count++;
}
return 0;
}
こちらは未経験者でもイメージしやすいように、「表示回数の上限」を定数で決めた例です。
LIMITが定数なので、「上限は変えない」という意図がはっきりします。
数値を直接書くよりも読みやすく、後から上限を変えたいときも一か所を見るだけで済むため、整理されたC言語の書き方につながります。
3. #defineで定数を作る方法
#defineは、C言語のプリプロセッサ命令を使って「名前」と「値」を結び付ける方法です。
ここで大事なのは、#defineは変数の宣言ではなく、コンパイル前に文字を置き換える仕組みだという点です。
そのため、プログラムの中に同じ数値や文字列が何度も登場するときに、ひとつの名前にまとめておくと読みやすくなります。
「決まった値を毎回書くのが面倒」「値の意味を分かりやすくしたい」という場面でよく使われます。
#include <stdio.h>
#define PI 3.14
int main(void)
{
printf("円周率は%fです。\n", PI);
return 0;
}
この例では、ソースコード中のPIが3.14に置き換えられてからコンパイルされます。
つまり、実行時にPIという入れ物があるわけではなく、「文字として差し替えられる」と考えるとイメージしやすいです。
その分、#defineには型の指定がなく、整数・小数・文字列なども自由に書けます。
ただし自由度が高いぶん、書き間違えても気づきにくいことがあるので、初心者は意味が伝わる名前を付けることが大切です。
#include <stdio.h>
#define GREETING "こんにちは"
#define TIMES 2
int main(void)
{
printf("%s\n", GREETING);
printf("表示回数は%d回です。\n", TIMES);
return 0;
}
このサンプルのように、#defineは文字列にも使えます。
何度も出てくる言葉や固定の回数を名前で表せるので、コードの意図が読み取りやすくなります。
一方で#defineは単純な置き換えのため、値の種類を間違えても型のチェックが働きにくいことがあります。
そのため、「決まった値に名前を付けて読みやすくする」という目的を意識して使うと、C言語の定数定義として扱いやすくなります。
4. constと#defineを徹底比較
どちらも定数を作る方法ですが、それぞれ特徴が違います。初心者向けにわかりやすく比較します。
- 型があるかどうか:constは型があり、defineは型がありません。
- エラーチェック:constはコンパイラがチェックするので安全です。
- デバッグしやすさ:constは変数扱いのため、エラー箇所を見つけやすいです。
- 書き換え防止:どちらも値は変わりませんが、constはコードの意図が伝わりやすいです。
たとえば数字のように単純な値を使うだけなら#defineでもいいですが、型がはっきりしたほうが安全なのでconstを使う場面が増えています。特に大きなプログラムや他の人と協力して開発する場合、constのほうが読みやすいことが多いです。セキュリティやバグ防止の観点でもconstが選ばれることが多く、プロの現場でも推奨されることがあります。
5. constと#defineのサンプル比較
二つの書き方をまとめたサンプルを見てみましょう。
#include <stdio.h>
#define MAX 100
const int MIN = 0;
int main(void)
{
printf("最大値は%dです。\n", MAX);
printf("最小値は%dです。\n", MIN);
return 0;
}
最大値は100です。
最小値は0です。
初心者が混乱しやすいポイントとして、defineは型が無いという点があります。文字列や複雑な数式も置き換えできますが、意図しない挙動が起こることもあります。そのため基本的なC言語学習では、まずconstを使う練習から始めると理解が深まります。
6. 実際の開発現場ではどちらが使われる?
現代のC言語では、定数定義にはconstを使う文化が広がっています。ツールやコンパイラによるチェックが強化され、エラーや警告に気づけるのが大きな理由です。もちろんdefineも便利で、特にヘッダファイルで共通値を扱うときに使われることがあります。しかし初心者が安全にプログラムを書くなら、まずconstを覚えるほうが良いでしょう。プログラミング学習の中で、定数を使う癖がつくと、後からコードを読んだときに理解しやすくなります。