for文の仕組みをもっと正確にとらえてみましょう


for文の仕組みをもっと正確にとらえてみましょう



ソーラー「今日は


for文の仕組みをもっと詳しく理解してみよう~


のコーナーです」


アレサ「for文の仕組み・・・ですの?


もう十分解説されていませんか?」



ソーラー「いやあ 


それが・・・


そうでもない・・・んだ💦



もしかしたら


for文の仕組みを正しく理解していない方もいるんじゃないかな(*^▽^*)


と思って


このエピソードで


for文の仕組みをもっと詳しく解説してみようと思ったんだ」


アレサ「そうです・・・の?」


ソーラー「そう


まずは


以下のプログラムをご覧ください

👇


#include <stdio.h>


int main(void){


int a;


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


printf("このprintf出力表示は%d回目です\n",a);


}

return 0;

}


プログラムの実行結果


このprintf出力表示は1回目です

このprintf出力表示は2回目です

このprintf出力表示は3回目です


アレサ 「ソーラーさん


よくみかけるタイプのfor{}文ですね」


ソーラー「そうだね


ところで


こう思っている方がおられるんじゃないかな?


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


printf("このprintf出力表示は%d回目です\n",a);


}

a=1は初期化式

a<=3は条件式

a++は継続処理方法


なので


aの値は


1

2

3



1から3まで変化するよね


だから


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


printf("このprintf出力表示は%d回目です\n",a);


}


のブロック{}内の命令文


printf("このprintf出力表示は%d回目です\n",a);



aの値


1

2

3

に対応して


3回


実行される・・・と


つまり


aの値が


3になるので


aの値


1

2

3

に対応して


printf("このprintf出力表示は%d回目です\n",a);



3回


繰り返し実行される


つまり


             🍇aの値が3だから🍇


printf("このprintf出力表示は%d回目です\n",a);



 🍇3回🍇


繰り返し実行される


つまり


   aの取る値イコールprintf("このprintf出力表示は%d回目です\n",a);



繰り返し実行される回数だと・・・・・・」


アレサ「??え?


う~んん


?????


う~んん?


何かが・・・


違う・・・」



ソーラー「ふふ


そうだね


では


今度は


次のプログラムをご覧ください

👇



#include <stdio.h>


int main(void){


int a;


for(a=1; a<=10; a=a+2){


printf("printfが実行されました\n");


}

return 0;

}


プログラムの実行結果


printfが実行されました

printfが実行されました

printfが実行されました

printfが実行されました

printfが実行されました


ソーラー「このプログラムは


どういう仕組みで動いてると思う?」


アレサ「


for(a=1; a<=10; a=a+2){


printf("printfが実行されました\n");


}


が実行されると


for(a=1; a<=10; a=a+2){


printf("printfが実行されました\n");


}


のブロック内の命令文


printf("printfが実行されました\n");


が繰り返し実行されることになります


まず


a=1のときの


1回目の


printf("printfが実行されました\n");


が実行されることになります


次に


継続処理方法が


a=a+2


なので


aの取る値は3になります


ですので


a=3のときの


2回目の


printf("printfが実行されました\n");


が実行されることになります


次に


継続処理方法が


a=a+2


なので


aの取る値は


3に2を足した5になります


ですので


a=5のときの


3回目の


printf("printfが実行されました\n");


が実行されることになります


次に


継続処理方法が


a=a+2


なので


aの取る値は


5に2を足した7になります


ですので


a=7のときの


4回目の


printf("printfが実行されました\n");


が実行されることになります


次に


継続処理方法が


a=a+2


なので


aの取る値は


7に2を足した9になります


ですので


a=9のときの


5回目の


printf("printfが実行されました\n");


が実行されることになります


次に


継続処理方法が


a=a+2


なので


aの取る値は


9に2を足した11になります


for(a=1; a<=10; a=a+2){


printf("printfが実行されました\n");


}



条件式は


a<=10


なので


a=11


だと


条件式(論理式)


a<=10



0の値を持つことになります


ですので


for(a=1; a<=10; a=a+2){


printf("printfが実行されました\n");


}


のブロック内の命令文


printf("printfが実行されました\n");



実行されることはなく


これで


for(a=1; a<=10; a=a+2){


printf("printfが実行されました\n");


}


の実行は終了となります」


ソーラー「そうだね お見事


アレサ😊


aの値は


1から


11まで


変化するので


for(a=1; a<=10; a=a+2){


printf("printfが実行されました\n");


}


のブロック内の命令文


printf("printfが実行されました\n");



実行されると


プログラムの実行結果は


printfが実行されました

printfが実行されました

printfが実行されました

printfが実行されました

printfが実行されました

printfが実行されました

printfが実行されました

printfが実行されました

printfが実行されました

printfが実行されました


となる・・・


条件式

a<=10;



10が記述されているので


printf("printfが実行されました\n");



10回実行される


もしくは


aの値が11になるからといって


printf("printfが実行されました\n");



11回実行される


なんてことにはならないよね」


アレサ「そうですね😊


ソーラーさん」


ソーラー「繰り返しますが


このプログラムにおいて


最終的には


aは11の値をとりますが


11回


printf("printfが実行されました\n");


が実行されることはないよね


つまり


aの取る値と


for(a=1; a<=10; a=a+2){


printf("printfが実行されました\n");


}


のブロック{}内の命令文


printf("printfが実行されました\n");



実行される回数はイコールではないよね


繰り返しますが


条件式


a<=10


となっているけど


これは


条件式


a<=10



成立しない場合


つまり


条件式


a<=10



成立しない場合


(偽(0)の値をとる場合)




for(a=1; a<=10; a=a+2){


printf("printfが実行されました\n");


}


のブロック内の命令文


printf("printfが実行されました\n");


の繰り返しが


終了することを表しているだけで


10回


for(a=1; a<=10; a=a+2){


printf("printfが実行されました\n");


}


のブロック内の命令文


printf("printfが実行されました\n");


が実行されることを


表しているわけではないね」


アレサ「はい ソーラーさん


そのとおりですの」


ソーラー「


そもそも


for{}文は


for(; ;){


printf("printfが実行されました\n");


}


のように


for(; ;)



用いられている状態が基本形なんだよ」


アレサ「for(; ;)



ですか?」


ソーラー「そうなんだよ


for(; ;)


と記述されていたなら


初期化式a=1

条件式a<=10

継続処理方法a=a+2


は記述されていないので


もちろん


変数aは登場してこないね


だけど


for(; ;){


printf("printfが実行されました\n");


}


が実行されると


1回目の printf("printfが実行されました\n");の実行

2回目の printf("printfが実行されました\n");の実行

3回目の printf("printfが実行されました\n");の実行


が行われることになります


もちろんのことだけど


初期化式a=1

条件式a<=10

継続処理方法a=a+2


は記述されていないので



                  🌞aの取る値と🌞


                 printf("printfが実行されました\n");


が実行される回数は🌞関係🌞ないね




そもそもの設定として


for(; ;){


printf("printfが実行されました\n");


}



ブロック{}内の命令文


printf("printfが実行されました\n");



無限に繰り返し実行するはたらきがあるんだよ



初期化式a=1

条件式a<=10

継続処理方法a=a+2


に関係なく



for(; ;){


printf("printfが実行されました\n");


}



ブロック{}内の命令文


printf("printfが実行されました\n");



             🌞繰り返し実行するはたらき🌞


があります



初期化式a=1

条件式a<=10

継続処理方法a=a+2


は繰り返し


実行を行うこと自体には関係ないんだ



その繰り返しの回数を制御するのが


初期化式a=1

条件式a<=10

継続処理方法a=a+2


というわけなんだね


for(; ;){


printf("printfが実行されました\n");


}


初期化式a=1

条件式a<=10

継続処理方法a=a+2


が記述された



for(a=1; a<=10; a=a+2){


printf("printfが実行されました\n");


}


が実行されると


printf("printfが実行されました\n");





5回実行されることになるけど


aの取る値は


繰り返しをするかしないかを判定するために用いられるんだ


だから


条件式 a<=10



10が記述されている


から


printf("printfが実行されました\n");



10回実行されるなんてことはなく


もしくは


最終的に


aの取る値が11になるから


11回


printf("printfが実行されました\n");


が実行されるなんてことはないんだね」







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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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