
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
- ユーザー入力などで変わるなら普通の変数
この切り分けができると、コードの設計が整ってきます。
