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");
が実行されるなんてことはないんだね」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます