C/C++ 変数の宣言とスコープ
C/C++ の変数宣言
主に変数のスコープについての覚書き。必要に応じ関連事項(メモ書き)も記載。グローバル変数(大域変数)
int i = 1; // 1.gv_i:グローバル変数 i int local_fn() { int i=10, max=100; // 2.lc_i1:関数内ローカル変数 i for(int i=0; i<max; i++) { // 3.lc_i2:forブロックローカル変数 i printf("i = %d\n",i); // 3.print lc_i2 } return i; // 2.lc_i1=10:関数内ローカル変数 i の値 } main() { int ret = local_fn(); // 2.lc_i1=10:戻り値 printf("i = %d\n",i); // 1.gv_i1=1:グローバル変数の値 }※グローバル変数とローカル変数が競合する場合、グローバル変数は、ローカル変数で隠蔽される。
ローカル変数(局所変数)
自動変数(オート変数)
ローカル変数でも、その有効範囲(期間)内で自動的に管理されている変数は、自動変数と呼ばれている。一般的に「ローカル変数」と呼ばれるのは、この自動変数である。
int local_fn(int a,int b) { a = 50; // 関数内ローカル変数へ代入 b = 60; // 〃 int c = a + b; // 110:関数内ローカル変数の計算 { int a = 10, b = 20; // ブロック内ローカル変数へ代入 int c = a * b; // 200:ブロック内ローカル変数の計算 } { double a = 128.50, b = 256.32; double c = a + b; // ブロックが有効範囲なので同変数名が利用可 } return c; // int型 110 が返される。 }※C++ では、関数、ブロック内の位置を問わず変数宣言には、特に決まりは無い。
※C言語では、原則関数、ブロックの先頭で変数を宣言する。
※スコープの範囲外(関数の外、ブロック外)では、ローカル変数を参照することは出来ない。
※一般的にローカル変数使用が推奨され、グローバル変数は使わないのが一般的。これにより関数間での変数名重複などによるバグ減少、及び関数の独立性、プログラム全体の簡素化?などを実現する。(内容非保証:グローバル変数を使わないのは慣例的に正しく、また、グローバル変数を使用することは、goto 文使用同様、感心されないのは事実。)
※注:このため、値渡し、参照渡し、ポインタなどを駆使し関数間で値を受け渡すことと成る。
スタティック変数(静的変数)
ローカル変数は、そのスコープ範囲が呼ばれる度、改めて領域を確保し作成される(そうでないと回帰などが実現しないので困る)が、関数やブロック(スコープ)終了で削除される変数と言うことになる。ローカル変数でありながら、その変数を静的に保持するする変数もあり、静的変数(スタティック変数)と呼ばれ、変数宣言時 static 修飾子を付けて宣言を行う。
fn_a() { static int a=100; // 静的変数(初回のみ初期化、以降値保持) int b=100; // 自動変数(毎回初期化、スコープ終了で破棄) printf("fn_a =%d\n", a++); // 100 101 102 … printf("fn_a =%d\n", b++); // 100 100 100 … } main() { for(int i=0; i<10; i++) { fn_a(); } }
静的変数は、関数、ブロック終了に関わらず前回値を保持すし、最初の宣言時のみ初期化が行われる。そのため上記のように静的変数は、前回のスコープ終了時の値を(プログラム終了時まで)保持し毎回インクリメントされる。
しかし、大域変数では無いので何処からでも呼べる(利用できる)訳ではないので、スコープ範囲は局所変数と同じである。
関連用語の覚書き
- スコープ
- 変数のスコープとか、関数でもスコープ範囲とか言われる。その変数などが適用される有効範囲を示しているようである。一般的に広範囲に利用可能なものをグローバル変数、関数内のみやブロック内のみで有効なものはローカル変数と呼ばれる。
- スタティック変数
- 静的変数とも呼ばれ、本来開放されるタイミングでも、静的に値を保持しているローカル変数を指す。グローバル変数とは異なり、他の関数、ブロックから利用することは出来ない。
▲上へ
リンク
内部リンク
- C/C++ C++/CLI C# 関連
- VC++ 2005 Express のインストール
- C/C++ の簡単なプログラム例
- C/C++ ソート(並べ替え)
- 変数・定数
- プログラムの分割/ダイナミックリンクライブラリ など
- その他
- C/C++ その他::書式文字/ESC code など
- VB2005リファレンス(覚え書き)
- SQL文:SQLステートメント
- VBA(VisualBasic for Applications)
外部リンク
- 現在ありません
▲上へ
2008年05月21日(水) 22:35:32 Modified by cafeboy1