17章 ジャンプ文
http://www.geocities.jp/ky_webid/c/017.html
ジャンプ文には、break文、continue文、goto文、return文の4つがあります。
continue、gotoは初お披露目ですね。
continueはループのスキップ処理です。breakのように抜けるのではなく、ループの最初にもどる文ですね。
gotoはどこでもジャンプです。
所謂スパゲティコード量産文というやつですね(^Д^)
だいたいわかったので問題に進みましょう。
問題1
次のプログラムは何をしているのでしょうか?
int main(void){ int i; i = 0; LOOP: printf( "%d\n", i ); ++i; if( i < 10 ){ goto LOOP; } return 0; }
なんだか複雑な処理に見えてしまうのはやはりgoto文のせいでしょうか。
内容は単純にiをインクリメントしていき、10以下の値のときはgoto LOOPで上に戻って反復処理をしています。
これはfor文で同じことが実現できると思うのでわざわざgotoを使う必要はなさそうに思えます。
答え合わせ
まず断っておきますが、こんなプログラムは書かないで下さいね。さて、このプログラムはfor文によるループを、goto文だけで実現しています。変数iの値が10より小さい間は、goto文によってLOOPラベルにジャンプします。iが10以上になると、 goto文が実行されなくなるので、ループが終了します。
ですよねー。
問題2
1から100までの整数のうち、奇数だけを表示するプログラムを作って下さい。ただし、偶数を表示しないようにするためにcontinue文をうまく使って下さい。
ifだけでも実現できるとおもいますが、continueを使って実装しろということなのでやってみます。
int main () { int i; for(i=1;i<=100;++i){ if ( i % 2 == 0 ) { continue; } printf("%d ",i); } return 0; }
できました。これは簡単ですね。
答え合わせ
はっきりいって意味のないプログラムです。こんなことでcontinue文など使う必要はありません。次のように書けますから。
int main(void){ int i; for(i=1; i<=100; i=i+2) /* iを+2ずつ増やしていく */ { printf( "%d\n", i ); /* 奇数のみ表示 */ } return 0; }
あ、面白いですね。確かに奇数を表示させるだけなら割った余りとかしなくても2ずつ足せばいいんですね。
実装にも色々やり方があるっていうのは楽しいですね。
問題3
キーボードから整数の入力を受け取る関数を作ります。このとき負数の入力をエラーであるとします。エラーが発生したことを戻り値によって、関数呼び出し側に知らせるようにして下さい。そして、関数呼び出し側は、エラーが発生した場合、エラーメッセージを表示させるようにして下さい。
愚直に。
int myfunc(); int myfunc () { int num; scanf("%d",&num); if ( num < 0 ) { return 0; } return 1; } int main () { if ( myfunc() ) { printf("正常に受け付けました\n"); } else { printf("エラーです\n"); } }
こんな感じかな。なんのことはないですね。