register と const
ヒントと不変性です。
「register と const」はCoddyKit上の無料C Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C Academyコースには全4レッスンが含まれています。
registerのヒント
registerは、速度向上のために変数をCPUレジスターに保持するよう提案します。ただし、あくまでヒントであり、現代のコンパイラーは通常これを無視します。
#include <stdio.h>
int main(void) {
register int i;
int sum = 0;
for (i = 0; i < 5; i++)
sum += i;
printf("sum = %d\n", sum);
return 0;
}アドレスを取得できない
register変数はメモリ上に存在しない可能性があるため、&でそのアドレスを取得することはできません。
#include <stdio.h>
int main(void) {
register int x = 10;
printf("x = %d\n", x);
return 0;
}registerが現在ほとんど使われない理由
最適化コンパイラーは、頻繁に使われる変数をすでにレジスターに配置します。そのため、現在このキーワードは主に歴史的なものになっています。
#include <stdio.h>
int main(void) {
int product = 1;
for (register int i = 1; i <= 4; i++)
product *= i;
printf("product = %d\n", product);
return 0;
}const修飾子
constを付けると、変数は初期化後に読み取り専用になります。変更しようとするとコンパイルエラーになります。
#include <stdio.h>
int main(void) {
const int DAYS = 7;
printf("DAYS = %d\n", DAYS);
return 0;
}定数で意図を示す
固定値にconstを使うとコードが分かりやすくなり、誤った変更から保護できます。
#include <stdio.h>
int main(void) {
const double PI = 3.14159;
double r = 2.0;
printf("area = %.2f\n", PI * r * r);
return 0;
}ポインターとconst
const int *pは、pを通じて指し先の値を変更できないことを意味します。ポインター自体は別の場所を指すように変更できます。
#include <stdio.h>
int main(void) {
int x = 5;
const int *p = &x;
printf("*p = %d\n", *p);
return 0;
}constポインター
int * const pは、ポインター自体は変更できませんが、指し先の値は変更できることを意味します。
#include <stdio.h>
int main(void) {
int x = 5;
int * const p = &x;
*p = 9;
printf("x = %d\n", x);
return 0;
}const付きの関数引数
引数にconstを付けると、関数がその引数を変更しないことを保証できます。これにより、呼び出し側で動作を把握しやすくなります。
#include <stdio.h>
void show(const int n) {
printf("n = %d\n", n);
}
int main(void) {
show(42);
return 0;
}設計による不変性
変更すべきでない値には、constを付けることをおすすめします。コンパイル時にバグを検出できます。
#include <stdio.h>
int main(void) {
const int LIMIT = 100;
int x = 90;
if (x < LIMIT)
printf("under limit\n");
return 0;
}constとグローバル変数の組み合わせ
グローバルなconstは、ファイル全体から利用できる安全な共有定数になります。
#include <stdio.h>
const int VERSION = 2;
int main(void) {
printf("VERSION = %d\n", VERSION);
return 0;
}registerとconstの組み合わせ
ループカウンターに両方の指定を付けることもできますが、この場合のconstは、ループ本体でその値を変更してはいけないことを意味します。
#include <stdio.h>
int main(void) {
int sum = 0;
for (int i = 0; i < 3; i++) {
const int doubled = i * 2;
sum += doubled;
}
printf("sum = %d\n", sum);
return 0;
}理解度チェック
registerとconstについて理解できているか確認しましょう。
まとめ:registerとconst
2つの修飾子について学びました。
registerはレジスターへの格納を提案しますが、通常は無視される- register変数のアドレスは取得できない
constは値を読み取り専用にする- ポインターのconst性には、constな値とconstなポインターの2種類がある
- 安全性のために
constを積極的に使う
よくある質問
「register と const」レッスンは無料ですか?
はい。「register と const」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C Academyコースには全4レッスンが含まれています。
「register と const」で何を学びますか?
ヒントと不変性です。 ブラウザで直接実行するハンズオンコードでC Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「register と const」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC Academyレッスンでコードを書いて実行できますか?
はい。すべてのC Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- auto とローカルスコープ
- static 変数
- extern とグローバル変数
- register と const