C言語のきほん|値を守るためのconst

間違って変えたくない値は const でロック!「変更できない」と宣言して、バグの芽を先に摘もう。

プログラムには、「絶対に変わってほしくない値」がよく登場します。
たとえば消費税率、配列の最大サイズ、1週間の日数、円周率みたいな値ですね。

こういう値を普通の変数で持っていると、どこかでうっかり代入してしまって、気づかないまま計算結果がズレる…という事故が起きがちです。しかもこのタイプのバグは、原因が見つかりにくいことも多いんです。

そこで使うのが const
const を付けると「この変数は読み取り専用です」と宣言でき、値を変更できない変数になります。
つまり、値を守るための“安全装置”として働いてくれるんですね。

const って何?(ざっくり言うと)

const は 型修飾子 で、変数に付けると「変更禁止」という性質を追加します。

  • 変数は“入れ物”だけど、const を付けると“鍵付きの入れ物”になる
  • 読むのはOK、書き換えはNG

この「書き換え禁止」をコンパイラがチェックしてくれるので、早い段階でミスに気づけます。

const 型修飾子の書き方(文法)

基本形はこれです。

const 型名 変数名 = 初期値;

ポイントは2つあります。

  • const を付けた変数は、宣言と同時に初期化が必須になりやすい(少なくとも教材としては「必須」と覚えてOK)
  • 値を変えようとするとコンパイル時に止めてくれる

変数名は大文字がよく使われる

慣習として、定数っぽい名前は大文字にすることが多いです。

  • TAX_RATE
  • MAX_USERS
  • DAYS_IN_WEEK

でもこれは「読みやすくするための習慣」で、必須ルールではありません。

const を使うと何が嬉しいの?

うっかり変更をコンパイル時に防げる

const がないと、間違って代入してもそのまま実行できてしまいます。
const があると、代入した瞬間に「それダメだよ!」と止めてくれます。

意図が伝わる(読み手に優しい)

const を見るだけで、「この値は変化しない前提なんだな」と分かります。
自分のコードを未来の自分が読むときにも助かります。

“マジックナンバー”が減る

式の中に 100 や 0.1 が突然出てくると、意味が分かりにくいですよね。
const で名前を付けると、計算式が読みやすくなります。

サンプルプログラム

元の MAX=100 の例を、「1週間の日数」を使った例に置き換えます。表示メッセージも別の日本語です。コメントも日本語にしています。

ファイル名:6_12_1.c

#include <stdio.h>

int main(void)
{
    const int DAYS_IN_WEEK = 7;  /* 1週間の日数は変えたくない */

    printf("1週間は%d日です。\n", DAYS_IN_WEEK);

    /* DAYS_IN_WEEK = 8; */  /* これはエラーになる(変更できない) */

    printf("メッセージ: constを付けると値を守れます。\n");
    return 0;
}

ここでコメントアウトしている代入を有効にすると、コンパイラが「const なのに変更しようとしてるよ」と教えてくれます。

const の基本ルールを表で整理

項目内容
const を付けるとその変数は読み取り専用になる
書き換えようとするとコンパイルエラーになりやすい
初期化宣言と同時に行うのが基本(教材としては必須と覚えると安全)
名前大文字は慣習で、必須ではない

const は「定数そのもの」とは少し違う

ここ、ちょっと大事な言い方の整理です。

  • const を付けた変数は「変更できない変数」
  • だから実務では「定数っぽく扱える」ので、便宜的に const 定数 と呼ばれることがある

でも、文書にもある通り const 定数 という言葉はC標準の正式用語ではありません
とはいえ学習上は「定数のように扱える値」くらいの理解でOKです。

どんな値を const にすると良い?

よくあるパターンをまとめるとこんな感じです。

const に向いてる理由
税率、円周率、係数変えると計算全体が壊れる
上限値(最大人数、最大文字数)うっかり変更すると配列や処理の前提が崩れる
仕様で固定の値(1週間=7日)意味のある数字に名前を付けられる
初期設定値(基準値)読みやすくなり、事故が減る

つまずきポイント:const なのに「変えたくなる」設計をしない

もし途中で変更したくなるなら、それは const にする値ではなく、別の変数として設計したほうがスッキリします。

  • 仕様として固定なら const
  • ユーザー入力などで変わるなら普通の変数

この切り分けができると、コードの設計が整ってきます。