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



マックス「では


次のプログラムではっ



int a;

int b;

int c;

main関数内で変数宣言されているので


変数

a

b

c


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

は~はっはっは~は~


簡単ん~💖 簡単ん~💖」



#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が変数宣言された{}(ブロック)内の


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;

}


となります。



ローカル変数宣言


int b;


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


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


int 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が変数宣言された{}(ブロック)内の


int 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);

}

//🌞ローカル変数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;


によって生成される


変数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


のスコープは


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


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

👇

🍎

#include <stdio.h>

int main(void){


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++){

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

}

}

}

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

}


こんな感じかな。


main関数のブロック{}内で


int a;

int b;

int c;



実行されているので


変数,b,cの使用可能な範囲は


main関数のブロック{}内となります




それに対し

🍊のプログラムでは→」


🍊

#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のスコープは下のプログラムのように


int 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のスコープは


int 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のスコープは



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;

}


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


結局


変数宣言

int a;

int b;

int c;

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


プログラムの実行結果は同じ


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


になるんだな」









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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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