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回も


ご飯はかつおです


が表示されないなんてね・・」




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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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