複数のローカル変数のスコープ(変数宣言により作製された変数の使用可能な範囲)を考察してみましょう。その2

マックス「では


次のプログラムではっ


int a;

int b;

int c;



main関数内で定義されているので


変数

a

b

c


main関数のローカル変数だ-☆(*´▽`*)~~


は~はっはっは~は~


簡単ん~💖 簡単ん~💖」



#include <iostream>


using namespace std;


int main(){


int a;

for(a=1;a<3;a++){


int b;

for(b=1;b<4;b++){


int c;

for(c=1;c<5;c++){


cout << c << "回目のご飯はNouvel de かつおです\n";


}

}

}

return 0;

}


ソーラー


「そのとおりです。


このプログラムは


まず


int c;

for(c=1;c<5;c++)

{

cout << c << "回目のご飯はNouvel de かつおです\n";

}


の実行によって


1回目のご飯はNouvel de かつおです

2回目のご飯はNouvel de かつおです

3回目のご飯はNouvel de かつおです

4回目のご飯はNouvel de かつおです


が生成されることになり


😊正確には


cout << 1 << "回目のご飯はNouvel de かつおです\n";

cout << 2<< "回目のご飯はNouvel de かつおです\n";

cout << 3<< "回目のご飯はNouvel de かつおです\n";

cout << 4 << "回目のご飯はNouvel de かつおです\n";


が生成されることになり


次に


int b;

for(b=1;b<4;b++)

{}


により、

生成された

1回目のご飯はNouvel de かつおです

2回目のご飯はNouvel de かつおです

3回目のご飯はNouvel de かつおです

4回目のご飯はNouvel de かつおです


が三回繰り返され


1回目のご飯はNouvel de かつおです

2回目のご飯はNouvel de かつおです

3回目のご飯はNouvel de かつおです

4回目のご飯はNouvel de かつおです

1回目のご飯はNouvel de かつおです

2回目のご飯はNouvel de かつおです

3回目のご飯はNouvel de かつおです

4回目のご飯はNouvel de かつおです

1回目のご飯はNouvel de かつおです

2回目のご飯はNouvel de かつおです

3回目のご飯はNouvel de かつおです

4回目のご飯はNouvel de かつおです


が生成されることとなり


😊正確には生成された


cout << 1 << "回目のご飯はNouvel de かつおです\n";

cout << 2<< "回目のご飯はNouvel de かつおです\n";

cout << 3<< "回目のご飯はNouvel de かつおです\n";

cout << 4 << "回目のご飯はNouvel de かつおです\n";


が三回繰り返され


cout << 1 << "回目のご飯はNouvel de かつおです\n";

cout << 2<< "回目のご飯はNouvel de かつおです\n";

cout << 3<< "回目のご飯はNouvel de かつおです\n";

cout << 4 << "回目のご飯はNouvel de かつおです\n";

cout << 1 << "回目のご飯はNouvel de かつおです\n";

cout << 2<< "回目のご飯はNouvel de かつおです\n";

cout << 3<< "回目のご飯はNouvel de かつおです\n";

cout << 4 << "回目のご飯はNouvel de かつおです\n";

cout << 1 << "回目のご飯はNouvel de かつおです\n";

cout << 2<< "回目のご飯はNouvel de かつおです\n";

cout << 3<< "回目のご飯はNouvel de かつおです\n";

cout << 4 << "回目のご飯はNouvel de かつおです\n";


が生成されることとなり


最後に


int a;

for(a=1;a<3;a++){}によって


1回目のご飯はNouvel de かつおです

2回目のご飯はNouvel de かつおです

3回目のご飯はNouvel de かつおです

4回目のご飯はNouvel de かつおです

1回目のご飯はNouvel de かつおです

2回目のご飯はNouvel de かつおです

3回目のご飯はNouvel de かつおです

4回目のご飯はNouvel de かつおです

1回目のご飯はNouvel de かつおです

2回目のご飯はNouvel de かつおです

3回目のご飯はNouvel de かつおです

4回目のご飯はNouvel de かつおです


が2回繰り返されることにより


😊正確には



cout << 1 << "回目のご飯はNouvel de かつおです\n";

cout << 2<< "回目のご飯はNouvel de かつおです\n";

cout << 3<< "回目のご飯はNouvel de かつおです\n";

cout << 4 << "回目のご飯はNouvel de かつおです\n";

cout << 1 << "回目のご飯はNouvel de かつおです\n";

cout << 2<< "回目のご飯はNouvel de かつおです\n";

cout << 3<< "回目のご飯はNouvel de かつおです\n";

cout << 4 << "回目のご飯はNouvel de かつおです\n";

cout << 1 << "回目のご飯はNouvel de かつおです\n";

cout << 2<< "回目のご飯はNouvel de かつおです\n";

cout << 3<< "回目のご飯はNouvel de かつおです\n";

cout << 4 << "回目のご飯はNouvel de かつおです\n";



が2回繰り返された



cout << 1 << "回目のご飯はNouvel de かつおです\n";

cout << 2<< "回目のご飯はNouvel de かつおです\n";

cout << 3<< "回目のご飯はNouvel de かつおです\n";

cout << 4 << "回目のご飯はNouvel de かつおです\n";

cout << 1 << "回目のご飯はNouvel de かつおです\n";

cout << 2<< "回目のご飯はNouvel de かつおです\n";

cout << 3<< "回目のご飯はNouvel de かつおです\n";

cout << 4 << "回目のご飯はNouvel de かつおです\n";

cout << 1 << "回目のご飯はNouvel de かつおです\n";

cout << 2<< "回目のご飯はNouvel de かつおです\n";

cout << 3<< "回目のご飯はNouvel de かつおです\n";

cout << 4 << "回目のご飯はNouvel de かつおです\n";

cout << 1 << "回目のご飯はNouvel de かつおです\n";

cout << 2<< "回目のご飯はNouvel de かつおです\n";

cout << 3<< "回目のご飯はNouvel de かつおです\n";

cout << 4 << "回目のご飯はNouvel de かつおです\n";

cout << 1 << "回目のご飯はNouvel de かつおです\n";

cout << 2<< "回目のご飯はNouvel de かつおです\n";

cout << 3<< "回目のご飯はNouvel de かつおです\n";

cout << 4 << "回目のご飯はNouvel de かつおです\n";

cout << 1 << "回目のご飯はNouvel de かつおです\n";

cout << 2<< "回目のご飯はNouvel de かつおです\n";

cout << 3<< "回目のご飯はNouvel de かつおです\n";

cout << 4 << "回目のご飯はNouvel de かつおです\n";


が実行されることにより


ビルド実行結果は


1回目のご飯はNouvel de かつおです

2回目のご飯はNouvel de かつおです

3回目のご飯はNouvel de かつおです

4回目のご飯はNouvel de かつおです

1回目のご飯はNouvel de かつおです

2回目のご飯はNouvel de かつおです

3回目のご飯はNouvel de かつおです

4回目のご飯はNouvel de かつおです

1回目のご飯はNouvel de かつおです

2回目のご飯はNouvel de かつおです

3回目のご飯はNouvel de かつおです

4回目のご飯はNouvel de かつおです

1回目のご飯はNouvel de かつおです

2回目のご飯はNouvel de かつおです

3回目のご飯はNouvel de かつおです

4回目のご飯はNouvel de かつおです

1回目のご飯はNouvel de かつおです

2回目のご飯はNouvel de かつおです

3回目のご飯はNouvel de かつおです

4回目のご飯はNouvel de かつおです

1回目のご飯はNouvel de かつおです

2回目のご飯はNouvel de かつおです

3回目のご飯はNouvel de かつおです

4回目のご飯はNouvel de かつおです


となります


合計6回 コンパイル結果に


1回目のご飯はNouvel de かつおです

2回目のご飯はNouvel de かつおです

3回目のご飯はNouvel de かつおです

4回目のご飯はNouvel de かつおです


が表示されています


この場合


ローカル変数宣言


int c;


によって作製されたローカル変数cのスコープは


ローカル変数cが変数宣言された{}(ブロック)内となり


👉👈で示された範囲


#include <iostream>


using namespace std;


int main(){


int a;

for(a=1;a<3;a++){


int b;

for(b=1;b<4;b++){


int c;👉

for(c=1;c<5;c++){

cout << c << "回目のご飯はNouvel de かつおです\n";

}


👈}


}

return 0;

}

となります。


ローカル変数宣言

int b;


によって作製されたローカル変数bのスコープは


ローカル変数bが変数宣言された{}(ブロック)内の


int b;以下の行となり


👉👈で示された範囲


#include <iostream>


using namespace std;


int main(){


int a;

for(a=1;a<3;a++){


int b;👉

for(b=1;b<4;b++){


int c;

for(c=1;c<5;c++){


cout << c << "回目のご飯はNouvel de かつおです\n";


}

}

👈}


return 0;


}


となります


ローカル変数宣言


int a;


によって作製された変数aのスコープは


ローカル変数aが変数宣言された{}(ブロック)内の


int a;以下の行となり


👉👈で示された範囲


#include <iostream>


using namespace std;


int main(){


int a;👉

for(a=1;a<3;a++){


int b;

for(b=1;b<4;b++){


int c;

for(c=1;c<5;c++){


cout << c << "回目のご飯はNouvel de かつおです\n";


}

}

}

return 0;

👈}


となります。


ローカル変数cのスコープはせまいですね。


ここで次のプログラムのように


ローカル変数cのスコープ外でローカル変数cを使ってしまうと


プログラムの実行時ビルドエラーが表示されます


#include <iostream>


using namespace std;


int main(){


int a;

for(a=1;a<3;a++){


int b;

for(b=1;b<4;b++){


int c;👉

for(c=1;c<5;c++){

cout << c << "回目のご飯はNouvel de かつおです\n";

}

👈}

}

cout << c << "ここはローカル変数cのスコープの外です。\n";


//↑ローカル変数cのスコープの外の部分に変数cを使った命令文を追加しました


return 0;


}


ソーラー「このプログラムを実際にビルド実行してみると


#include <iostream>


using namespace std;


int main(){


int a;

for(a=1;a<3;a++){


int b;

for(b=1;b<4;b++){


int c;

for(c=1;c<5;c++){

cout << c << "回目のご飯はNouvel de かつおです\n";

}

}

}

cout << c << "ここはローカル変数cのスコープの外です。\n";


//↑ローカル変数cのスコープの外の部分に変数cを使った命令文を追加しました


return 0;


}


ビルド実行結果


エラー C2065 'c': 定義されていない識別子です。

エラー (アクティブ) E0020 識別子 "c" が定義されていません


と表示されます。


このようにビルドエラーが表示されるのは


命令文


cout << c << "ここはローカル変数cのスコープの外です。\n";


の中で用いられているcが


ローカル変数宣言


int c;


のスコープ外で使用されているからなんです。


つまり ローカル変数はグローバル変数のように


変数宣言した行以下がすべてスコープに


なるわけではないということです。」


マックス「いままでは


変数のスコープというものがわからず


for文のブロック{}内でつかわれる変数が機能するよう


その変数の変数宣言を


プログラム内の


どこに記述したらいいか


いまいちわからなかったんだよなあ


ははは


だから


次の🍎のプログラムのように


👇


変数宣言

int a;

int b;

int c;


を記述するのか


🍎


#include <iostream>


using namespace std;


int main(){


int a;

int b;

int c;


for(a=1;a<3;a++){

for(b=1;b<4;b++){

for(c=1;c<5;c++){


cout << c << "回目のご飯はNouvel de かつおです\n";


}

}

}

return 0;

}


この


🍊プログラムのような位置に


変数宣言


int a;

int b;

int c;


を記述するのか



🍊


#include <iostream>


using namespace std;


int main(){


int a;

for(a=1;a<3;a++){


int b;

for(b=1;b<4;b++){


int c;

for(c=1;c<5;c++){


cout << c << "回目のご飯はNouvel de かつおです\n";


}

}

}

return 0;

}



変数宣言の位置によってどのような違いがでるのか


\(^o^)/


わからなかったんだよな~


しかし ローカル変数宣言のスコープがわかってきたので


この2つのプログラムのちがいも


わかるようになったわけだ。


最初の🍎プログラムでは


🍎


#include <iostream>


using namespace std;


int main(){


int a;

int b;

int c;


for(a=1;a<3;a++){

for(b=1;b<4;b++){

for(c=1;c<5;c++){


cout << c << "回目のご飯はNouvel de かつおです\n";


}

}

}

return 0;

}


変数a

変数b

変数c


のスコープは


ブロック内の👉と👈の間の部分となる。


下のプログラムにその範囲を表してみると


👇


🍎


#include <iostream>


using namespace std;


int main(){


int a;👉aのスコープの開始位置

int b;👉bのスコープの開始位置

int c;👉cのスコープの開始位置


for(a=1;a<3;a++){

for(b=1;b<4;b++){

for(c=1;c<5;c++){


cout << c << "回目のご飯はNouvel de かつおです\n";


}

}

}

return 0;👈a,b,cのスコープの終端位置

}


こんな感じかな。


それに対し


🍊のプログラムでは→」


🍊


#include <iostream>


using namespace std;


int main(){


int a;

for(a=1;a<3;a++){


int b;

for(b=1;b<4;b++){


int c;

for(c=1;c<5;c++){


cout << c << "回目のご飯はNouvel de かつおです\n";


}

}

}

return 0;

}



マックス「→


変数宣言int a;が実行されたブロック{}内の👉👈


の範囲となり



🍊


#include <iostream>


using namespace std;


int main(){


int a;👉

for(a=1;a<3;a++){


int b;

for(b=1;b<4;b++){


int c;

for(c=1;c<5;c++){

cout << c << "回目のご飯はNouvel de かつおです\n";

}

}

}


return 0;


👈}



変数宣言int b;が実行されたブロック{}内の👉👈


の範囲となり


(下のプログラムを参照してください)


🍊


#include <iostream>


using namespace std;


int main(){


int a;

for(a=1;a<3;a++){


int b;👉

for(b=1;b<4;b++){


int c;

for(c=1;c<5;c++){


cout << c << "回目のご飯はNouvel de かつおです\n";

}

}

👈}

return 0;

}



変数cのスコープは


変数宣言int c;が実行されたブロック{}内の👉👈


の範囲となるわけか。


(下のプログラムを参照してください)


🍊


#include <stdio.h>


int main(){

int a;


for(a=1;a<3;a++){


int b;

for(b=1;b<4;b++){


int c;👉

for(c=1;c<5;c++){

cout << c << "回目のご飯はNouvel de かつおです\n";

}

👈}

}

return 0;

}


マックス「この2つのプログラムの場合は


結局


変数宣言

int a;

int b;

int c;


の位置がかわってはいるが


ビルド実行結果は同じになるんだな」

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る