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");
    }
}

こんな感じかな。なんのことはないですね。