最近更新したページ
2013-10-20
2013-09-29
2013-09-23
2012-01-07
2011-11-09
2011-10-23
2011-10-09
2011-10-01
2011-09-29
2011-09-03
2011-08-07
2011-08-02
2011-07-29
2011-07-10
2011-05-05
2011-05-04
2011-04-24
2011-04-13
2011-04-05
2011-03-26
2011-02-18
2011-02-15
2010-12-26
2010-12-07
2010-12-05
2010-11-23
2010-09-28
2010-09-23
2010-08-26
2010-08-22
2010-07-16
2010-01-17
2010-01-11
2009-10-04
2009-08-21
2009-08-13
2009-06-18
2009-06-01
2009-04-29
2009-02-16
2009-02-11
2009-02-03
2008-07-22
2008-07-21
2008-07-15
2008-07-14
2008-07-13
2008-07-12
2008-07-08
2008-07-05
2008-06-28
2008-06-17
2008-06-05
2008-06-02
2008-06-01
2008-05-29
2008-05-26
2008-05-21
2008-05-19
2008-05-18
2007-10-31
2007-10-27
2007-09-28
2007-09-23
2007-09-17
2007-09-16
2007-09-14
2007-09-11
2007-06-18
2007-04-15
2006-12-21
2006-11-30
2006-11-22
2006-08-17
2006-03-29
2006-03-28
2006-03-27

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();
   }
}

 静的変数は、関数、ブロック終了に関わらず前回値を保持すし、最初の宣言時のみ初期化が行われる。そのため上記のように静的変数は、前回のスコープ終了時の値を(プログラム終了時まで)保持し毎回インクリメントされる。
 しかし、大域変数では無いので何処からでも呼べる(利用できる)訳ではないので、スコープ範囲は局所変数と同じである。
 

関連用語の覚書き


スコープ
変数のスコープとか、関数でもスコープ範囲とか言われる。その変数などが適用される有効範囲を示しているようである。一般的に広範囲に利用可能なものをグローバル変数、関数内のみやブロック内のみで有効なものはローカル変数と呼ばれる。

スタティック変数
静的変数とも呼ばれ、本来開放されるタイミングでも、静的に値を保持しているローカル変数を指す。グローバル変数とは異なり、他の関数、ブロックから利用することは出来ない。

▲上へ

リンク


内部リンク


外部リンク


  • 現在ありません

▲上へ
2008年05月21日(水) 22:35:32 Modified by cafeboy1




スマートフォン版で見る