C++の静的変数・自動変数・グローバル変数・ローカル変数の違いを徹底解説
C++の変数には、混同されやすい2つの独立した概念が存在します。
- スコープ(scope) ... 名前がどこからアクセス可能かを決める概念。「グローバル」と「ローカル」に分類される
- 記憶域期間(storage duration) ... 変数がいつ生成され、いつ破棄されるかを決める概念。「静的」と「自動」に分類される
スコープとは
ローカル変数は、その関数またはコードブロックの内側にあるステートメントからのみ使用できます。ローカル変数は、他の関数からは参照できません。
サンプルコード
#include <iostream>
using namespace std;
int main () {
// ローカル変数の宣言:
int a, b;
int c;
// 実際の初期化
a = 10;
b = 20;
c = a + b;
cout << c;
return 0;
}
このプログラムを実行すると、以下の出力が得られます。
実行結果
30
グローバル変数は、すべての関数の外側、通常はプログラムの先頭付近で定義されます。グローバル変数は、プログラムの生存期間中ずっと値を保持し続け、どの関数からでもアクセスすることが可能です。
サンプルコード
#include <iostream>
using namespace std;
// グローバル変数の宣言:
int g;
int main () {
// ローカル変数の宣言:
int a, b;
// 実際の初期化
a = 10;
b = 20;
g = a + b;
cout << g;
return 0;
}
このプログラムを実行すると、以下の出力が得られます。
実行結果
30
記憶域期間とは
自動変数とは、実行フローがそのスコープを抜けると寿命が尽き、再びスコープに入ったときに新しく生成されるローカル変数のことです。
サンプルコード(自動変数の場合)
for (int i = 0; i < 5; ++i) {
int n = 0;
printf("%d ", ++n); // 1 1 1 1 1 と出力される — 毎回値がリセットされる
}
一方、静的変数はプログラムが終了するまで存続する寿命を持ちます。静的変数として定義されたローカル変数は、実行がスコープを抜けても値が保持されます。
サンプルコード(静的変数の場合)
for (int i = 0; i < 5; ++i) {
static int n = 0;
printf("%d ", ++n); // 1 2 3 4 5 と出力される — 値が保持される
}
注意点
staticキーワードは、静的な記憶域期間の指定以外にも、文脈によってさまざまな意味を持つ点に注意が必要です。また、C++においてautoキーワードは、かつての「自動記憶域期間」を意味しなくなりました。現在では、変数の初期化子から型を自動的に推論する型推論(auto type deduction)を表します。
-
C++における#defineとconstキーワードの違いとは?
#defineとconstの基本的な違い#defineディレクティブはプリプロセッサディレクティブです。プリプロセッサは、コンパイラがソースコードを認識する前に、マクロをその定義内容で単純に置き換えます。イメージとしては、ソースコード全体に対して自動的に実行される「検索と置換」のようなものです。const変数の特徴一方、constによる変数宣言は、言語仕様上の実際の変数を宣言するものです。そのため、通常の変数と同じように扱うことができます。具体的には、以下のような操作が可能です。アドレスの取得(ポインタや参照への代入)関数への引数としての受け渡しキャストや型変換パフォーマンスとスコープの違いコ
-
Pythonのグローバル変数とローカル変数の違いとは?わかりやすく解説
Pythonにおいて、グローバル変数とはプログラム全体(モジュール内のどこからでも)アクセスできる変数のことです。一方、ローカル変数は特定のスコープ内、たとえば関数定義の中でのみアクセスできる変数であり、関数内で一時的に使用される変数などがこれに該当します。コード例以下のコードを見てみましょう。q = I love coffee # グローバル変数 def f(): p = Me Tarzan, You Jane. # ローカル変数 print(p) f() print(q)実行結果このコードを実行すると、次のような出力が得られます。Me Tarzan, You Jan