0Pricing
C Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. auto とローカルスコープ
  2. static 変数
  3. extern とグローバル変数
  4. register と const
← C Academyに戻る