Cでは,変数の宣言はブロックの先頭だけでやることになっている. しかし,C++では,ブロックのどこで宣言してもかまわない. たとえばこんな感じだ.
このとき,変数のスコープは,宣言された時点からそのブロックの 最後までだ.ちょっと厄介なのが,for文の中で宣言された変数である.main() { printf("Hello¥n"); int i = 0; while (i < 10) { printf("world¥n"); i++; } }
このとき,最新のC++の仕様では,変数iのスコープは, forで繰り返すブロックの中になる.ところが,以前の仕様では, iのスコープはfor文が属する外側のブロックだった. そのため,古いC++のプログラムは新しいC++コンパイラでは動かず, またその逆も起こる.for (int i = 0; i < 10; i++) { .... }
変数宣言について,CとC++で違うところがもう1つある.それは, 大域変数とstatic変数の初期化である.Cでは,大域変数と static変数の初期化には,定数式しか使えなかった.これに対して, C++では,定数でない普通の式を使って大域変数の初期化をすることができる. 例えば
のような記述ができる.#include <math.h> double log3 = log(3.0); double s = (1+sqrt(log3))/2;
これらの変数はいつ初期化されるのだろうか? よくある実装は,main()が呼ばれる前に,大域変数を 初期化する関数が呼ばれるというものだ.こうすれば,main() が呼ばれるときには,すでに大域変数は初期化されているというわけだ.