【解決】continueがうまくいきません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
helloworld
記事: 6
登録日時: 7年前

【解決】continueがうまくいきません

#1

投稿記事 by helloworld » 7年前

カウントを表示するプログラムを作っています。
0
1
2
3
4
6
7
8
9
と出力させたいのにうまくいきません。
どなたか教えてください。

コード:

 
  1 #include <stdio.h>
  2  int main(void) {
  3     int m = 0;
  4     while (m < 10) {
  5        m++;         
  6         if(m == 5) {
  7             continue; 
  8         }
  9    // この部分にあるコードがスキップされる
 10        printf("m:%d\n",m);
 11     }
 12  }
最後に編集したユーザー helloworld on 2016年8月25日(木) 11:03 [ 編集 1 回目 ]

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: continueがうまくいきません

#2

投稿記事 by みけCAT » 7年前

  • 変な位置に数字があるので、コンパイルエラーになる
  • その蛇足な数字を消すと
    • 書式指定文字列が間違っているので、m:という余計な文字列が出力される
    • mをインクリメントするタイミングが悪いので、表示する範囲がおかしくなる
という問題がありますね。
例えば余計な数字と文字列を消し、mのインクリメントを出力の後にしてこうするといいでしょう。

コード:

#include <stdio.h>
int main(void) {
    int m = 0;
    while (m < 10) {
        if(m == 5) {
            m++;
            continue;
        }
        // この部分にあるコードがスキップされる
        printf("%d\n", m);
        m++;
    }
    return 0;
}
若干美しくない気がしますが、初期値をずらすことで範囲を正しくする方法もあります。
m++;を複数書く汚さとトレードオフですね。

コード:

#include <stdio.h>
int main(void) {
    int m = -1;
    while (++m < 10) { // ここでインクリメントし、インクリメント後の値をチェック
        if(m == 5) {
            continue;
        }
        // この部分にあるコードがスキップされる
        printf("%d\n", m);
    }
    return 0;
}
もしくは、for文を使って

コード:

#include <stdio.h>
int main(void) {
    int m;
    for (m = 0; m < 10; m++) {
        if(m == 5) {
            continue;
        }
        // この部分にあるコードがスキップされる
        printf("%d\n", m);
    }
    return 0;
}
最後に編集したユーザー みけCAT on 2016年8月25日(木) 10:24 [ 編集 1 回目 ]
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
asd
記事: 319
登録日時: 13年前

Re: continueがうまくいきません

#3

投稿記事 by asd » 7年前

helloworld さんが書きました:カウントを表示するプログラムを作っています。
0
1
2
3
4
6
7
8
9
と出力させたいのにうまくいきません。
どなたか教えてください。
提示されているプログラムをそのまま動かすと以下の様な出力になります。

コード:

m:1
m:2
m:3
m:4
m:6
m:7
m:8
m:9
m:10
あなたの思った結果と何が違っていてどうしたいのでしょうか?

A.”m:”がいらないんだけど!
 →printfからm:を消してください

B.0から9まで出したいのに1から10まで出力されてるんだけど!
 →mの初期値を-1にするか、m++の実行位置をprintfの後とcontinueの前においてください
  continueの前にm++を書かないとm==5の状態ではm++が実行されずにcontinueが実行されるため無限ループになります

ちなみにコメントに書かれている「// この部分にあるコードがスキップされる」は
m++をprintfの後ろに書いた際にm:4の出力以降何も出力されない(無限ループしてるので)ことを指しているのでしょうか?
Advanced Supporting Developer
無理やりこじつけ(ぉ

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: continueがうまくいきません

#4

投稿記事 by みけCAT » 7年前

helloworld さんが書きました:continueがうまくいきません
そもそも、無駄にcontinueなんか使わなければいいのです。
適材適所。

コード:

#include <stdio.h>
int main(void) {
    int m = 0;
    while (m < 10) {
        if(m != 5) {
            // この部分にあるコードがスキップされる
            printf("%d\n", m);
        }
        m++;
    }
    return 0;
}
オフトピック
ダメ押しで余計とも思えるループも省くと

コード:

#include <stdio.h>
int main(void) {
    puts("0\n1\n2\n3\n4\n6\n7\n8\n9");
    return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

helloworld
記事: 6
登録日時: 7年前

Re:解決しました!ありがとうございました!!

#5

投稿記事 by helloworld » 7年前

解決しました!
ご丁寧に解説していただきありがとうございました!
for文でうまくできたので、
while文でもうまくできるのではないかと思って質問させていただいたきました。

カウントアップを使うときは
-1
で始めるか
continue
を2回使う
のですね。

できれば、
-1で始めない
continueは1回
と思っていたのですが、
これは無理なのですね("^ω^)・・・

勉強になりました。
ありがとうございました!

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: 【解決】continueがうまくいきません

#6

投稿記事 by Dixq (管理人) » 7年前

> できれば、
> -1で始めない
> continueは1回
> と思っていたのですが、
> これは無理なのですね

・-1で始めない
・continueは0回
でよければNo: 4のコードで実現できていると思いますがこれじゃダメですか?

box
記事: 2002
登録日時: 13年前

Re: Re:解決しました!ありがとうございました!!

#7

投稿記事 by box » 7年前

helloworld さんが書きました: continue
を2回使う
どこにそういう回答があったでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

閉鎖

“C言語何でも質問掲示板” へ戻る