変数の記憶クラス

スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 |
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般

変数は、スコープのほかに、記憶クラスという属性も持っています。
変数の記憶クラスは、永続的なものと一時的なものの2つがあります。

スポンサーリンク

グローバル変数は、常に永続的な記憶クラスとなり、プログラムが終了するまで存続します。
一時的な変数は、ブロックの先頭にあるスタックというメモリ領域で割り当てられ、ブロックの終わりでスタックに返され、ブロックが実行される度に初期化されます。
ローカル変数は、静的な(static)変数として宣言しない限り、一時的な記憶クラスとなります。

#include <iostream>
 
int main() {
    int counter;    // カウンタ
    // forループ
    for (counter = 0; counter < 5; counter++) {
        int temp = 1;    // ブロックが実行されるたびに初期化される一時的な記憶クラスの変数
        static int perm = 1;    // static宣言
 
        std::cout << "Temp:" << temp << " Perm:" << perm << " Counter:" << counter << "\n";
        temp++;
        perm++;
    }
    std::cout << "Out of forloop:\n";
    std::cout << "Counter:" << counter << "\n";
}

実行結果。

Temp:1 Perm:1 Counter:0
Temp:1 Perm:2 Counter:1
Temp:1 Perm:3 Counter:2
Temp:1 Perm:4 Counter:3
Temp:1 Perm:5 Counter:4
Out of forloop:
Counter:5

ここで、forループの中で、カウンターを初期化する書き方をしてみると・・・

// 2つ目のforループ
for (int i = 5; i < 10; i++) {    // for文の中で変数iを初期化
    std::cout << i << "\n";
}
std::cout << i << "\n";    // ここでは、「i」はスコープを外れている。初期化されていない変数だ、とエラーメッセージが出る

この場合、変数「i」のスコープは、for文のブロック内のみとなります。

スポンサーリンク
 
スポンサーリンク