カテゴリ: C言語 更新日: 2026/02/23

C言語の定数定義を完全解説!初心者でもわかるconstと#defineの違い

C言語の定数定義(const, #define)の違いを徹底比較
C言語の定数定義(const, #define)の違いを徹底比較

先生と生徒の会話形式で理解しよう

生徒

「C言語で数字や文字を何度も使いたいときに、毎回同じ数値を書くのは大変ですよね?」

先生

「その通りです。そんなときに便利なのが定数です。決まった値に名前を付けることで、後から読みやすくなり、間違いも少なくなります。」

生徒

「C言語では定数ってどんなふうに書くんですか?」

先生

「C言語ではconst#defineという二つの方法があります。すこしややこしく感じるかもしれませんが、ゆっくり解説します。」

1. C言語における定数とは?

1. C言語における定数とは?
1. C言語における定数とは?

C言語の定数とは、プログラムの実行中に値を変更できない決まった値のことを指します。 見た目は変数に似ていますが、「途中で書き換えない」というルールがある点が大きな特徴です。 たとえば円周率や税率、人数の上限、ゲームの最大スコアなど、常に同じ意味で使いたい数値に名前を付けることで、 ソースコードの意味が分かりやすくなります。 数字だけが並んだコードよりも意図が伝わりやすくなり、後から見直したときにも理解しやすくなります。

プログラミング初心者にとっても、定数を使うことで「この値は変えてはいけない」というルールを コード上ではっきり示せるため、ミスを防ぐ助けになります。 小さなプログラムでも定数を意識して使う習慣を付けると、読みやすく整理されたコードを書けるようになります。


#include <stdio.h>

int main(void)
{
    const int LIMIT = 3;
    printf("回数の上限は%dです。\n", LIMIT);
    return 0;
}

このサンプルでは、LIMITという定数を使って回数の上限を表しています。 数字を直接書く代わりに名前を付けることで、「何を表す数値なのか」が一目で分かります。 このように定数は、プログラムの意味を伝えやすくするための大切な考え方です。

2. constで定数を作る方法

2. constで定数を作る方法
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で定数を作る方法

3. #defineで定数を作る方法
3. #defineで定数を作る方法

#defineは、C言語のプリプロセッサ命令を使って「名前」と「値」を結び付ける方法です。 ここで大事なのは、#defineは変数の宣言ではなく、コンパイル前に文字を置き換える仕組みだという点です。 そのため、プログラムの中に同じ数値や文字列が何度も登場するときに、ひとつの名前にまとめておくと読みやすくなります。 「決まった値を毎回書くのが面倒」「値の意味を分かりやすくしたい」という場面でよく使われます。


#include <stdio.h>

#define PI 3.14

int main(void)
{
    printf("円周率は%fです。\n", PI);
    return 0;
}

この例では、ソースコード中のPI3.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を徹底比較

4. constと#defineを徹底比較
4. constと#defineを徹底比較

どちらも「定数を表す」ための書き方ですが、仕組みが違うため、得意な場面も変わってきます。 初心者のうちは、見た目が似ていても中身は別物だと押さえておくと混乱しにくいです。 ざっくり言うと、constは「型付きの定数」、#defineは「文字の置き換え」というイメージです。 その違いが、エラーの出方や読みやすさにもつながります。

  • 型があるかどうか:constはintやdoubleなど型があり、defineは型がありません。
  • エラーチェック:constはコンパイラがチェックするため、代入ミスなどに気づきやすいです。
  • デバッグしやすさ:constは変数に近い扱いなので、値を追いかけやすい場面があります。
  • 書き換え防止:どちらも値は変えない目的ですが、constは「変更しない意図」が読み取りやすいです。

#include <stdio.h>

#define MAX 5

int main(void)
{
    const int LIMIT = 5;

    printf("defineのMAXは%dです。\n", MAX);
    printf("constのLIMITは%dです。\n", LIMIT);
    return 0;
}

このサンプルでは、どちらも同じ数値を扱っていますが、#defineはコンパイル前にMAXが5へ置き換えられ、 constは「型を持つ定数」として扱われます。 数字のように単純な値を置き換えるだけなら#defineでも書けますが、 型がはっきりしたほうが安心なので、constを使う場面が増えています。 とくに他の人が読むC言語のソースコードでは、意図が伝わりやすい書き方を選ぶと、後からの修正や確認が楽になります。

5. constと#defineのサンプル比較

5. constと#defineのサンプル比較
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. 実際の開発現場ではどちらが使われる?

6. 実際の開発現場ではどちらが使われる?
6. 実際の開発現場ではどちらが使われる?

現代のC言語では、定数定義にはconstを使う文化が広がっています。ツールやコンパイラによるチェックが強化され、エラーや警告に気づけるのが大きな理由です。もちろんdefineも便利で、特にヘッダファイルで共通値を扱うときに使われることがあります。しかし初心者が安全にプログラムを書くなら、まずconstを覚えるほうが良いでしょう。プログラミング学習の中で、定数を使う癖がつくと、後からコードを読んだときに理解しやすくなります。

カテゴリの一覧へ
新着記事
New1
C++
C++のメンバアクセス演算子を完全解説!初心者でもわかる . → :: の使い方まとめ
New2
Rust
Rustの文字列を極める!&str(文字列スライス)の基本概念とString型との違い
New3
C++
C++のキャスト演算子を完全解説!dynamic_cast・static_cast・const_cast・reinterpret_castを初心者向けに説明
New4
C++
C++開発のIDE選びを完全ガイド!初心者でもわかるCLion・Eclipse CDT・Qt Creator比較
人気記事
No.1
Java&Spring記事人気No1
C++
C++の主要な実装をわかりやすく解説!GCC・Clang・MSVCの違いと特徴
No.2
Java&Spring記事人気No2
C言語
C言語を学ぶ初心者におすすめの環境構築手順【2025年版】
No.3
Java&Spring記事人気No3
C言語
C言語のソースコードとヘッダファイルの役割とは?初心者向けにわかりやすく解説!
No.4
Java&Spring記事人気No4
C言語
C言語をオンラインで実行できる便利なコンパイラサービスまとめ【初心者向け】
No.5
Java&Spring記事人気No5
C言語
Visual Studio CodeでC言語を実行する方法【拡張機能の設定と実行手順】
No.6
Java&Spring記事人気No6
C言語
C言語開発でよく使われるエディタとIDEランキング【初心者向け完全ガイド】
No.7
Java&Spring記事人気No7
C++
C++リンカとコンパイラのオプション設定を完全ガイド!初心者にもわかる開発環境の基礎
No.8
Java&Spring記事人気No8
C言語
C言語の列挙型(enum)の使い方を完全ガイド!初心者でもわかる基本操作