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

C言語のconstと#defineの違いを徹底比較!初心者でもわかる使い分けガイド

constと#defineの違いを徹底比較【どちらを使うべき?】
constと#defineの違いを徹底比較【どちらを使うべき?】

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

生徒

「C言語で定数を作るとき、constと#defineってどっちを使うべきなんですか?」

先生

「どちらも値を変えられない定数を作る方法ですが、仕組みや使い方が大きく違います。状況によって使い分けることでプログラムが正しく動きやすくなります。」

生徒

「違いがよく分からなくて、なんとなく#defineばかり使っていました。」

先生

「初心者のうちは同じに見えますが、コンパイルの仕組みやメモリの扱いが異なるので、学習する価値があります。それでは詳しく見ていきましょう。」

1. constと#defineはどちらも定数を作れる

1. constと#defineはどちらも定数を作れる
1. constと#defineはどちらも定数を作れる

C言語には、値を後から変更できない定数を作る方法が複数あります。その代表がconst#defineです。どちらも「変更されない値」を扱えますが、内部での動きが違います。プログラムの安全性や読みやすさを考えると、目的に合わせた選び方が重要です。

constは変数と同じ感覚で扱え、型を持った定数として宣言できます。一方、#defineはプリプロセッサという仕組みで名前を値に置き換えるだけのルールになっています。この違いが、使い方の差につながります。

2. constの基本と書き方

2. constの基本と書き方
2. constの基本と書き方

constは「変更できない変数」を作るための仕組みです。型を指定して宣言するため、間違った使い方をするとエラーが出てくれます。


const int TAX = 10;
printf("%d\n", TAX);

この書き方なら、TAXに別の値を代入しようとするとエラーになります。数値だけでなく、小数、文字、文字列など様々な型に使えます。コンパイル時に型チェックが働くので、初心者でも安全に扱えます。

3. #defineの基本と書き方

3. #defineの基本と書き方
3. #defineの基本と書き方

#defineはプリプロセッサという仕組みで、プログラム内の文字をそのまま置き換える命令です。変数とは違い、型を持ちません。


#define TAX 10
printf("%d\n", TAX);

プログラムがコンパイルされる前の段階でTAXが「10」に置き換えられます。型が無いため柔軟ですが、間違った使い方でも気づきにくいという欠点があります。

4. constと#defineの決定的な違い

4. constと#defineの決定的な違い
4. constと#defineの決定的な違い

同じように見えて、仕組みは大きく異なります。次のポイントが理解のカギです。

  • constは型を持つが、defineは型を持たない
  • constは変数としてメモリに存在するが、defineは文字置換で存在しない
  • エラーの検出はconstの方が有利

#define t 10/2
const int c = 10/2;
printf("%d\n", t);
printf("%d\n", c);

この例ではどちらも同じ結果に見えますが、defineはただの文字置換なので計算式をそのまま書いたのと同じ扱いになります。型のないまま置き換えられるため、思いがけない動きをすることもあります。

5. defineは命令として置き換えもできる

5. defineは命令として置き換えもできる
5. defineは命令として置き換えもできる

defineは数字だけでなく文字列や式を丸ごと置き換えることもできます。定数だけでなく、短い処理を定義して使う場面もあります。


#define HELLO printf("こんにちは!\n")
HELLO;

このように、関数のように見えても実際には文字の置換なので注意が必要です。ミスをしてもエラーにならず、そのまま置き換えられてしまうこともあります。

6. constは変数と同じように扱える

6. constは変数と同じように扱える
6. constは変数と同じように扱える

constは型を持つため、配列や構造体と組み合わせて使う場面でも便利です。たとえば文字列を変更されたくないときにも使えます。


const char msg[] = "ようこそ!";
printf("%s\n", msg);

この書き方なら、誤って書き換えようとした場合にエラーになります。「絶対に変更されたくないデータ」を保護しやすいのがconstの強みです。

7. 実際にはどちらを使うべき?

7. 実際にはどちらを使うべき?
7. 実際にはどちらを使うべき?

結論として、初心者はconstを使う方が安全で扱いやすいと言えます。型が明確なため、コンパイラが間違いを見つけてくれるからです。

一方、#defineは柔軟で便利ですが、使い方を間違えると予想外の動作が起きる場合があります。プログラムが複雑になるほど、constの方が読みやすく管理しやすい場面が増えます。

8. 例で見比べてみよう

8. 例で見比べてみよう
8. 例で見比べてみよう

まずはdefineだけで書いた例です。


#define DISCOUNT 2
int price = 100 / DISCOUNT;
printf("%d\n", price);

次にconstで同じ処理を書いた例です。


const int DISCOUNT = 2;
int price = 100 / DISCOUNT;
printf("%d\n", price);

動きは同じですが、constは型があるため安心して扱えます。型の間違いもコンパイラが教えてくれるため、初心者には大きな助けになります。

9. 実行結果の例

9. 実行結果の例
9. 実行結果の例

50

どちらでも同じ結果になりますが、保守性や安全性を考えるとconstが選ばれる場面が多くなります。

10. 型チェックがあるかないかが大事

10. 型チェックがあるかないかが大事
10. 型チェックがあるかないかが大事

変数に似た仕組みを使いたいならconst、シンプルに置き換えたいだけなら#defineが向いています。プログラムが大きくなるほど、型のチェックがあるconstの方が安心です。

最近のC言語入門書やプログラミング教育でも、定数はconstを使う方が主流になっています。トラブルを避けるうえでも、基本はconst、特殊な場合だけdefineと覚えると理解しやすくなります。

関連記事:
カテゴリの一覧へ
新着記事
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言語
C言語開発でよく使われるエディタとIDEランキング【初心者向け完全ガイド】
No.6
Java&Spring記事人気No6
C言語
Visual Studio CodeでC言語を実行する方法【拡張機能の設定と実行手順】
No.7
Java&Spring記事人気No7
C言語
C言語の列挙型(enum)の使い方を完全ガイド!初心者でもわかる基本操作
No.8
Java&Spring記事人気No8
C++
C++リンカとコンパイラのオプション設定を完全ガイド!初心者にもわかる開発環境の基礎