if() continue文を使用する際は()の中の条件式の記述方法にご注意ください
ソーラー 「さて、このif() continue文
for文の中では
次のプログラムのように記述されます。
👇
(以下のプログラムは
for{}文の繰り返しの中で
a=5となったとき
printf("%d回目のご飯はかつおです\n",a);
を実行しないよう
if(a=5)continue;
が
for{}文のブロック{}内に書き込んであります。
ですが
まちがっています。
さてさて どこが まちがっているかな?)
#include <stdio.h>
int main(void){
int a;
for(a=1;a<10;a++){
if(a=5)continue;
printf("%d回目のご飯はかつおです\n",a);
}
return 0;
}
ソーラー 「それにしてもC言語は魚介類や野菜が豊富だねえ~」
てんC 「そうですね。お野菜と魚を混ぜて
ぶーにゃんさんの
ソーラー 「それではっ
このプログラムを コンパイルっと」
プログラムの実行結果
_(アンダーバー)
ソーラー 「あれっ?
なぜ_(アンダーバー)だけが表示されてるのかな?
アンダーバーだけがコマンドプロンプト画面に表示されているときは
プログラムが実行され続けてるんじゃなかったかな?
このプログラム、予想では
プログラムの実行結果に
5回目のご飯はかつおです
が表示されず
1回目のご飯はかつおです
2回目のご飯はかつおです
3回目のご飯はかつおです
4回目のご飯はかつおです
6回目のご飯はかつおです
7回目のご飯はかつおです
8回目のご飯はかつおです
9回目のご飯はかつおです
が表示されるはずだったんだけど・・・
読者のみなさんはどう思う?」
😝😝😝😝😝😝😝😝😝😝😝😝😝😝😝😝😝😝😝😝
てんC「for文の中にif()continue;文があって
プログラムの実行結果が
_(アンダーバー)
だけ表示されている場合ですか?
先のエピソードでも登場しましたね。
このプログラムでは
for(a=1;a<10;a++){
if(a=5)continue;
printf("%d回目のご飯はかつおです\n",a);
}
のなかで
if(a=5)continue;
と記述されていますね。
0以外の整数値がif()の()内に
if(5),
if(100)
if(a=5)
のように記述してあれば
1が記述されたとみなされます
if(a=5)は
if(5)が記述されているとみなされます
if(5)は
if(1)
が記述されたとみなされます
if(a=5)continue;
は
if(1)continue;
になるというわけです
となると
常にif(1)に続く命令文continue;
が発動することになります
この段階で
この回のfor{}文のブロック{}内の命令文の繰り返し実行は終了して
次の回のfor{}文のブロック{}内の命令文の繰り返し実行にうつります
となると
continue;
につづく
continue;
以下の命令文は常に実行されないことになります
ですので
for文によるa=1のときの1回目の繰り返しのとき
if(a=5)continue;
に続く命令文
printf("%d回目のご飯はかつおです\n",a);
は実行されません
次に
for文によるa=2のときの2回目の繰り返しに移りますが
if(a=5)continue;
の
if()の()の中の値が真の値1をもつことにより
if(a=5)continue;
に続く命令文
printf("%d回目のご飯はかつおです\n",a);
は実行されません
次に
for文によるa=3のときの3回目の繰り返しに移りますが
if(a=5)continue;
の
if()の()の中の値が真の値1をもつことにより
if(a=5)continue;
に続く命令文
printf("%d回目のご飯はかつおです\n",a);
は実行されません
・
・
・
・
・
以下繰り返して
・
・
・
for文によるa=9のときの9回目の繰り返しに移りますが
if(a=5)continue;
の
if()の()の中の値が真の値1をもつことにより
if(a=5)continue;
に続く命令文
printf("%d回目のご飯はかつおです\n",a);
は実行されず とばされて
for文によるa=10のときの10回目の繰り返しに移りますが
条件式a<10
が
10<10
となり
偽の値をもつので
for{}文のブロック{}内の命令文の繰り返し実行は終了となります
このプログラムは終了とは・・・・・・なりません」
マックス「へい?
for(a=1;a<10;a++){
if(a=5)continue;
printf("%d回目のご飯はかつおです\n",a);
}
の条件式は
a<10
だから
a=9回目で
for文の繰り返しは終わるんるんじゃないのか?」
ソーラー「
for(a=1;a<10;a++){
if(a=5)continue;
printf("%d回目のご飯はかつおです\n",a);
}
に注目してください
まず
for文によるa=1のときの1回目の
if(a=5)continue;
printf("%d回目のご飯はかつおです\n",a);
の繰り返しが行われるのですが
if(a=5)continue;
により
continue;が実行されるので
printf("%d回目のご飯はかつおです\n",a);
は
実行されません。
このとき
aの値はif(a=5)によりa=5となっています。
ですので
継続処理方法a++により
aの値5に1が加えられた
次は
for文によるa=6のときの2回目の
命令文
if(a=5)continue;
printf("%d回目のご飯はかつおです\n",a);
の繰り返しが行われるのですが
if(a=5)continue;により
continue;が実行されるので
printf("%d回目のご飯はかつおです\n",a);
は
実行されません。
このとき
aの値はif(a=5)により
再びa=5となっています
ですので
継続処理方法a++により
aの値5に1が加えられ
次は
for文によるa=6のときの3回目の
if(a=5)continue;
printf("%d回目のご飯はかつおです\n",a);
の繰り返しが行われるのですが
if(a=5)continue;により
continue;が実行されるので
printf("%d回目のご飯はかつおです\n",a);
は
実行されません。
このとき
aの値はif(a=5)によりa=5となっています
・
・
・
このようにfor(a=1;a<10;a++){}文の条件式
a<10
をaは満たしつづけるため
プログラムの実行は無限につづいていきます
そのため
プログラムの実行結果には
プログラムの実行中をしめす
_(アンダーバー)
だけが表示されるのですね。
ですので
プログラムの実行が終了したことを示す
続行するには何かキーを押して下さい . . ._
は表示されません。」
🍊🍊🍊
実はこの時コンピュータはプログラムを終了することができず
プログラムを実行し続けています
アンダーバーが表示されているので
プログラムが終了したと思ってしまいますね。
プログラムが終了したと思い
新たにもう1つ別のプログラムを実行すると
(Visual Studioの場合)
エラー LNK1168 ファイル c:\users\solarplexuss\source\repos\Project11\Debug\Project11.exe を開いて書き込むことができません。
と表示されます。
Visual Studioでは1度に1つのプログラムしか実行できないため
2つのプログラムを実行しようとすると
このようなビルドエラーが表示されます
ですので
別のプログラムを実行するには
いったんアンダーバーが表示されているコマンドプロンプト画面を
消してプログラムの実行を終了させる必要があります。
🍊🍊🍊
ソーラー 「そうか・・
if(a=5)continue;
により
if(a=5)に続く命令文
continue;
が
for文の全ての繰り返しの回
発動している・・・
if(a=5)の(a=5)のなかの論理式は常に真の値1になっているんだよね。
となると・・・」
てんC「いまのプログラムの
if()continue;文は
if(a=5)continue;となっていますね
ソーラーさん
もともと このif(a=5)内の論理式a=5は
for文のa=5回目の繰り返しを実行しないために
かきこんだのですか?」
ソーラー「そう(^^)/
5回目のご飯はかつおです を省こうと思ったのは
5回目のご飯は何にしようか考え中だったからだよ~😊
かつおでなく百円SHOPのお菓子にしようかとも思っていたけれど・・・
そうだ、やっぱり 5回目のご飯は たいやきにしよっと。
これでねこちゃんも大満足!
あっ
プログラムの実行結果に
アンダーバー
_
しか表示されないようになったのは
a=5の論理式に問題があったということなんだよね」
てんC 「そうですね。
本来はif(a=5)でなくif(a==5)(aは5と等しいとき)
と記述するところのようですね。
関係演算子==をもちいた
a==5は論理式で
aが5に等しくなった時
論理式 a==5は真の値1をもちます。
それに対し
a=5は論理式ではなく
常に
a=5となっています
if(a=5)と記述された場合は
if(5)が記述されていることになります
if(a=5)
つまり
if(5)
と
if()の()内に0以外の数値が記述される場合
if(1)と等しい状態になるのでしたね。
ですので
if(a=5)に続く命令文
continue;
が常に作用しつづけるため
すべての繰り返しの回
命令文
printf("%d回目のご飯はかつおです\n", a);
が実行されないのです。
そこで
if(a=5)continue;の代わりに
if(a==5)continue;を記述したプログラムを実行してみると
👇
#include <stdio.h>
int main(void) {
int a;
for (a = 1; a<10; a++) {
if (a == 5)continue;
printf("%d回目のご飯はかつおです\n", a);
}
return 0;
}
プログラムの実行結果は
1回目のご飯はかつおです
2回目のご飯はかつおです
3回目のご飯はかつおです
4回目のご飯はかつおです
6回目のご飯はかつおです
7回目のご飯はかつおです
8回目のご飯はかつおです
9回目のご飯はかつおです
と
5回目のご飯はかつおです
だけ省かれたものが
printf出力表示されます(^^)。」
ソーラー「そういえばif()の中に0以外の数値を入力すると
例えば5,8などを入力すると
if(5),if(8)ともにif(1)とコンピューターに認識されるんだったね。」
てんC 「そうです。」
ソーラー「おおっなんてこったい
こんなことで プログラムの実行結果に
_(アンダーバー)だけが表示されて
1回も
ご飯はかつおです
が表示されないなんてね・・」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます