if() continue文を使用する際は()の中の条件式の記述方法にご注意ください 

ソーラー 「さて、このif() continue文


for文の中では


次のプログラムのように記述されます。

👇

(以下のプログラムは

for文の繰り返しの中で

a=5となったとき

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

を実行しないよう

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;

}




ソーラー 「それにしてもC言語は魚介類や野菜が豊富だねえ~」


てんC 「そうですね。お野菜と魚を混ぜて


ぶーにゃんさんのねこご飯がいつでも すぐにご用意できます。」


ソーラー 「それではっ


このプログラムを コンパイルっと」


コンパイル結果


_(アンダーバー)




ソーラー 「あれっ? 


なぜ_(アンダーバー)だけが表示されてるのかな?


アンダーバーだけがコマンドプロンプト画面に表示されているときは


プログラムが実行され続けてるんじゃなかったかな?



このプログラム、予想では


コンパイル結果に


5回目のご飯はかつおです

が表示されず


1回目のご飯はかつおです

2回目のご飯はかつおです

3回目のご飯はかつおです

4回目のご飯はかつおです

6回目のご飯はかつおです

7回目のご飯はかつおです

8回目のご飯はかつおです

9回目のご飯はかつおです


が表示されなければいけないんだけど・・・


読者のみなさんはどう思う?」



 😝😝😝😝😝😝😝😝😝😝😝😝😝😝😝😝😝😝😝😝



てんC「for文の中にif()continue;文があって


コンパイル結果が


_(アンダーバー)


だけ表示されている場合ですか?


先のエピソードでも登場しましたね。


このプログラムでは


if(a=5)continue;


と記述されていますね。


0以外の整数値が()内に

if(5),

if(100)

if(a=5)

のように記述してあれば

1が記述されたとみなされます


よって


if()の()の中の条件式の値が真の値1


をもつことにより


for文によるa=1のときの1回目の繰り返しの命令文である


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


は実行されず とばされ


a=2のときの2回目の繰り返しの命令文である


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


の実行に移ります 



if()の()の中の値が真の値1をもつことにより


for文によるa=2のときの2回目の繰り返しの命令文である

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


は実行されず とばされ


a=3のときの3回目の

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


の命令文の実行に移ります 


以下繰り返して

a=9のときの9回目の繰り返しの命令文である


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


の実行に移ります 



if()の()の中の値が真の値1をもつことにより


for文によるa=9のときの9回目の繰り返しの命令文である


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


は実行されず とばされて


このプログラムは終了とは・・・・・・なりません


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

if(a=5)continue;


に注目してください


まず


for文によるa=1のときの1回目の


命令文

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


の繰り返しが行われるのですが


if(a=5)continue;により実行されません。


このとき


aの値はif(a=5)によりa=5となっています。


ですので


a++により


aの値5に1が加えられた


次は


for文によるa=6のときの2回目の


命令文

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


の繰り返しが行われるのですが


if(a=5)continue;により実行されません。


このとき


aの値はif(a=5)により


再びa=5となっています


ですので


a++により


aの値5に1が加えられ


次は


for文によるa=6のときの3回目の


命令文

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


の繰り返しが行われるのですが


if(a=5)continue;により実行されません。


このとき


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()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()の()内に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 「そうです。」


ソーラー「おおっなんてこったい


こんなことで コンパイル結果が_(アンダーバー)だけに


なって 


ご飯はかつおです


が表示されないとは」




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

作者を応援しよう!

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

応援したユーザー

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