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

マックス「では


次のプログラムではっ



int a;

int b;

int c;

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


変数

a

b

c


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

は~はっはっは~は~


簡単ん~💖 簡単ん~💖」



#include <stdio.h>


int main(void){

int a;

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

int b;

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

int c;

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

printf("%d回目のご飯はNouvel de かつおです\n",c);

}

}

}

return 0;

}


ソーラー

「そのとおりです。



このプログラムは

まず

int c;

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

{

printf("%d回目のご飯はNouvel de かつおです\n",c);

}

の実行によって

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

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

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

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

が生成されることになり


😊正確には

printf("%d回目のご飯はNouvel de かつおです\n",1);

printf("%d回目のご飯はNouvel de かつおです\n",2);

printf("%d回目のご飯はNouvel de かつおです\n",3);

printf("%d回目のご飯はNouvel de かつおです\n",4);

が生成されることになり



次に

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 かつおです


が生成されることとなり


😊正確には生成された

printf("%d回目のご飯はNouvel de かつおです\n",1);

printf("%d回目のご飯はNouvel de かつおです\n",2);

printf("%d回目のご飯はNouvel de かつおです\n",3);

printf("%d回目のご飯はNouvel de かつおです\n",4);


が三回繰り返され

printf("%d回目のご飯はNouvel de かつおです\n",1);

printf("%d回目のご飯はNouvel de かつおです\n",2);

printf("%d回目のご飯はNouvel de かつおです\n",3);

printf("%d回目のご飯はNouvel de かつおです\n",4);

printf("%d回目のご飯はNouvel de かつおです\n",1);

printf("%d回目のご飯はNouvel de かつおです\n",2);

printf("%d回目のご飯はNouvel de かつおです\n",3);

printf("%d回目のご飯はNouvel de かつおです\n",4);

printf("%d回目のご飯はNouvel de かつおです\n",1);

printf("%d回目のご飯はNouvel de かつおです\n",2);

printf("%d回目のご飯はNouvel de かつおです\n",3);

printf("%d回目のご飯はNouvel de かつおです\n",4);


が生成されることとなり



最後に

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回繰り返されることにより


😊正確には


printf("%d回目のご飯はNouvel de かつおです\n",1);

printf("%d回目のご飯はNouvel de かつおです\n",2);

printf("%d回目のご飯はNouvel de かつおです\n",3);

printf("%d回目のご飯はNouvel de かつおです\n",4);

printf("%d回目のご飯はNouvel de かつおです\n",1);

printf("%d回目のご飯はNouvel de かつおです\n",2);

printf("%d回目のご飯はNouvel de かつおです\n",3);

printf("%d回目のご飯はNouvel de かつおです\n",4);

printf("%d回目のご飯はNouvel de かつおです\n",1);

printf("%d回目のご飯はNouvel de かつおです\n",2);

printf("%d回目のご飯はNouvel de かつおです\n",3);

printf("%d回目のご飯はNouvel de かつおです\n",4);


が2回繰り返された


printf("%d回目のご飯はNouvel de かつおです\n",1);

printf("%d回目のご飯はNouvel de かつおです\n",2);

printf("%d回目のご飯はNouvel de かつおです\n",3);

printf("%d回目のご飯はNouvel de かつおです\n",4);

printf("%d回目のご飯はNouvel de かつおです\n",1);

printf("%d回目のご飯はNouvel de かつおです\n",2);

printf("%d回目のご飯はNouvel de かつおです\n",3);

printf("%d回目のご飯はNouvel de かつおです\n",4);

printf("%d回目のご飯はNouvel de かつおです\n",1);

printf("%d回目のご飯はNouvel de かつおです\n",2);

printf("%d回目のご飯はNouvel de かつおです\n",3);

printf("%d回目のご飯はNouvel de かつおです\n",4);

printf("%d回目のご飯はNouvel de かつおです\n",1);

printf("%d回目のご飯はNouvel de かつおです\n",2);

printf("%d回目のご飯はNouvel de かつおです\n",3);

printf("%d回目のご飯はNouvel de かつおです\n",4);

printf("%d回目のご飯はNouvel de かつおです\n",1);

printf("%d回目のご飯はNouvel de かつおです\n",2);

printf("%d回目のご飯はNouvel de かつおです\n",3);

printf("%d回目のご飯はNouvel de かつおです\n",4);

printf("%d回目のご飯はNouvel de かつおです\n",1);

printf("%d回目のご飯はNouvel de かつおです\n",2);

printf("%d回目のご飯はNouvel de かつおです\n",3);

printf("%d回目のご飯はNouvel de かつおです\n",4);


が実行されることにより


コンパイル結果は


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 <stdio.h>


int main(void){

int a;

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

int b;

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

int c;

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

printf("%d回目のご飯はNouvel de かつおです\n",c);

}

👈}

}

return 0;

}


となります。



ローカル変数宣言


int b;


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


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



👉👈で示された範囲


#include <stdio.h>

int main(void){

int a;

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

int b;

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

int c;

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

printf("%d回目のご飯はNouvel de かつおです\n",c);

}

}

👈}

return 0;

}


となります


ローカル変数宣言


int a;


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


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


👉👈で示された範囲


#include <stdio.h>

int main(void){👉

int a;

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

int b;

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

int c;

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

printf("%d回目のご飯はNouvel de かつおです\n",c);

}

}

}

return 0;

👈}


となります。


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


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


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


コンパイルエラーが出ます


#include <stdio.h>

int main(void){

int a;

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

int b;

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

int c;

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

printf("%d回目のご飯はNouvel de かつおです\n",c);

}

👈}

}

printf("ここはローカル変数cのスコープの外です。%dは表示されるかな\n",c);

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

return 0;

}


ソーラー「このプログラムを実際にコンパイルしてみると


#include <stdio.h>


int main(void){

int a;

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

int b;

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

int c;

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

printf("%d回目のご飯はNouvel de かつおです\n",c);

}

}

}

printf("ここはローカル変数cのスコープの外です。%dは表示されるかな\n",c);

return 0;

}


コンパイル結果(EAZY IDECの場合)


ファイル「C:/Users/solarplexuss/AppData/Local/EasyIDEC/project/iii/main.c」の

「13行目」で記述エラーを発見しました。

警告

unknown escape sequence: '\x8e'

ファイル「C:/Users/solarplexuss/AppData/Local/EasyIDEC/project/iii/main.c」の

「13行目」で記述エラーを発見しました。

「c」が定義されていません。

名前が間違っていないかどうか確認してください。



ビルド結果(Visual Studioの場合)

識別子 "c" が定義されていません


と表示されます。


このようにコンパイルエラーが表示されるのは


命令文

printf("ここはローカル変数cのスコープの外です。%dは表示されるかな\n",c);


のprintf関数の第2引数のcが


ローカル変数宣言


int c;


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


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


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


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


マックス「いままでは


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


for文のブロック{}内でつかわれる変数の変数宣言を


プログラム内の


どこに記述したらいいか


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


ははは


だから


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

👇

変数宣言

int a;

int b;

int c;

を記述するのか


🍎

#include <stdio.h>

int main(void){


int a;

int b;

int c;


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

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

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

printf("%d回目のご飯はNouvel de かつおです\n",c);

}

}

}

return 0;

}


この


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


変数宣言

int a;

int b;

int c;

を記述するのか


🍊

#include <stdio.h>


int main(void){

int a;

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

int b;

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

int c;

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

printf("%d回目のご飯はNouvel de かつおです\n",c);

}

}

}

return 0;

}


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


\(^o^)/

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


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


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


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


最初の🍎プログラムでは


🍎

#include <stdio.h>


int main(void){


int a;

int b;

int c;


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

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

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

printf("%d回目のご飯はNouvel de かつおです\n",c);

}

}

}

return 0;

}



変数a

変数b

変数c


のスコープはともに


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


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

👇

🍎

#include <stdio.h>

int main(void){👉


int a;

int b;

int c;


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

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

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

printf("%d回目のご飯はNouvel de かつおです\n",c);

}

}

}

return 0;

👈}


こんな感じかな。


それに対し

🍊のプログラムでは


🍊

#include <stdio.h>

int main(void){

int a;

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

int b;

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

int c;

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

printf("%d回目のご飯はNouvel de かつおです\n",c);

}

}

}

return 0;

}


変数aのスコープは下のプログラムのように


ブロック{}内の👉👈


の範囲となり


🍊

#include <stdio.h>

int main(void){👉

int a;

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

int b;

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

int c;

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

printf("%d回目のご飯はNouvel de かつおです\n",c);

}

}

}

return 0;

👈}


変数bのスコープはブロック{}内の👉👈


の範囲となり

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

🍊

#include <stdio.h>

int main(void){

int a;

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

int b;

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

int c;

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

printf("%d回目のご飯はNouvel de かつおです\n",c);

}

}

👈}

return 0;

}



変数cのスコープはブロック{}内の👉👈


の範囲となるわけか。


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


🍊

#include <stdio.h>

int main(void){

int a;

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

int b;

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

int c;

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

printf("%d回目のご飯はNouvel de かつおです\n",c);

}

👈}

}

return 0;

}


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


結局


変数宣言

int a;

int b;

int c;

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


コンパイル結果は同じになるんだな」