const変数
値を読み取り専用にします。
「const変数」はCoddyKit上の無料C Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C Academyコースには全4レッスンが含まれています。
const の意味
const キーワードは、初期化後に変数の値を変更してはいけないことをコンパイラに伝えます。
後から変更しようとするとコンパイルに失敗します。これにより、固定しておくべき値を保護できます。
const int MAX_USERS = 100;const を宣言する
const 変数には、宣言時に値を指定する必要があります。後から代入できないためです。
ここでは PI を一度だけ初期化し、通常の変数と同じように読み取りに使っています。
#include <stdio.h>
int main(void) {
const double PI = 3.14159;
printf("%f\n", PI);
return 0;
}const を変更してみる
宣言後に const へ代入すると、コンパイルエラーになります。
次の行はコンパイラに拒否されます。これはまさに、期待している保護機能です。
const int LIMIT = 50;
/* LIMIT = 60; <- compile error */const には型がある
単なるマクロとは異なり、const 変数にはコンパイラがチェックする実際の型があります。
これにより型安全性が得られます。コンパイラは RATE が double 型だと認識し、誤った使い方に警告を出せます。
#include <stdio.h>
int main(void) {
const double RATE = 0.05;
double total = 200.0 * RATE;
printf("%.2f\n", total);
return 0;
}ポインタと const:データ
ポインタの const には2つの形があります。const int *p は、p を通じて指し先のデータを変更できないことを意味します。
p を別の場所に移すことはできますが、p を通じて書き込むことはできません。
int x = 5;
const int *p = &x;
/* *p = 9; <- error: data is const */ポインタと const:ポインタ
int *const p は、ポインタ自体を再代入できない一方で、指し先のデータは変更できることを意味します。
宣言は右から左に読みます。「p は int への const ポインタ」です。
int x = 5, y = 8;
int *const p = &x;
*p = 9; /* allowed */
/* p = &y; <- error: pointer is const */関数の引数を保護する
ポインタ引数にconstを付けると、関数が呼び出し元のデータを変更しないことを保証できます。
これにより意図が明確になり、誤った書き込みをコンパイラで検出できます。
#include <stdio.h>
void show(const char *msg) {
printf("%s\n", msg);
}
int main(void) {
show("hello");
return 0;
}計算でのconst
よくある用途は、税率や変換係数など、固定された設定値です。
定数を読み取ることで、計算式が分かりやすくなり、値も1か所で管理できます。
#include <stdio.h>
int main(void) {
const double KM_PER_MILE = 1.609;
double miles = 10.0;
printf("%.2f km\n", miles * KM_PER_MILE);
return 0;
}Constにはメモリ上の場所がある
constは実際の変数なので、メモリ領域を占有し、そのアドレスを取得できます。
これは、アドレスを持たず、純粋なテキスト置換を行う#defineマクロとは異なります。
#include <stdio.h>
int main(void) {
const int N = 42;
const int *p = &N;
printf("%d\n", *p);
return 0;
}スコープとライフタイム
constには、通常の変数と同じスコープ規則が適用されます。
関数内で宣言するとローカルになり、関数外で宣言するとグローバルになります。このスコープも、ファイル全体に及ぶマクロに対する利点の1つです。
#include <stdio.h>
const int GLOBAL_MAX = 1000;
int main(void) {
const int local_min = 1;
printf("%d %d\n", local_min, GLOBAL_MAX);
return 0;
}constとマジックナンバー
コード内の生の数値を名前付きのconst値に置き換えると、「マジックナンバー」をなくせます。
値を変更することになっても、プログラム全体を探し回るのではなく、1行を編集するだけで済みます。
#include <stdio.h>
int main(void) {
const int SECONDS_PER_MIN = 60;
int minutes = 5;
printf("%d seconds\n", minutes * SECONDS_PER_MIN);
return 0;
}理解度チェック
constの動作について、理解度を確認しましょう。
まとめ
const変数は型を持つ読み取り専用の値で、コンパイラによって変更から保護されます。
マクロとは異なり、型、スコープ、アドレスを持ちます。ポインタでは、constをデータ、ポインタ、またはその両方に適用できます。次は、これを#defineと比較します。
よくある質問
「const変数」レッスンは無料ですか?
はい。「const変数」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C Academyコースには全4レッスンが含まれています。
「const変数」で何を学びますか?
値を読み取り専用にします。 ブラウザで直接実行するハンズオンコードでC Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「const変数」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC Academyレッスンでコードを書いて実行できますか?
はい。すべてのC Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。