C++
 Computer >> コンピューター >  >> プログラミング >> C++

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)を表します。

  1. C++における#defineとconstキーワードの違いとは?

    #defineとconstの基本的な違い#defineディレクティブはプリプロセッサディレクティブです。プリプロセッサは、コンパイラがソースコードを認識する前に、マクロをその定義内容で単純に置き換えます。イメージとしては、ソースコード全体に対して自動的に実行される「検索と置換」のようなものです。const変数の特徴一方、constによる変数宣言は、言語仕様上の実際の変数を宣言するものです。そのため、通常の変数と同じように扱うことができます。具体的には、以下のような操作が可能です。アドレスの取得(ポインタや参照への代入)関数への引数としての受け渡しキャストや型変換パフォーマンスとスコープの違いコ

  2. Pythonのグローバル変数とローカル変数の違いとは?わかりやすく解説

    Pythonにおいて、グローバル変数とはプログラム全体(モジュール内のどこからでも)アクセスできる変数のことです。一方、ローカル変数は特定のスコープ内、たとえば関数定義の中でのみアクセスできる変数であり、関数内で一時的に使用される変数などがこれに該当します。コード例以下のコードを見てみましょう。q = I love coffee # グローバル変数 def f(): p = Me Tarzan, You Jane. # ローカル変数 print(p) f() print(q)実行結果このコードを実行すると、次のような出力が得られます。Me Tarzan, You Jan