2012-01-26 10 views
1

次は私の大学の割り当てのコードの一部です。Java - 条件に基づいてforループカウンタを戻す

else if (!codeList.contains(userCode)) { 
        i--; // i is the counter for the for-loop 
       } 
else if (userQuantity[i]==0) { 
        i--; 
       } 

最初の部分は、ユーザーが間違ったコードを入力した場合、カウンタiが1をインクリメントしない、というか、それが最近、インクリメントカウンタから1を減算していることを確認します。この部分はうまく動作します。

しかし、第2の部分は私が問題を抱えているようです。 userQuantity []はint配列であり、配列でなければなりません。これはコードには何もしないようです。数量に0を入力した場合でも、それは望ましくないカウンタを増分します。

混乱を避けるために、これは無限ループforループです(break文を使用)。私がfor-loopをやっている理由は、私が必要なためです。それは私のfor-loopのために状態が働いていないか、私は何か完全に間違っているのですか?

これは私の大学の授業のためのものですので、クイックフィックスだけでなく解説もありがたいです。説明が必要な場合は、私に教えてください。

+0

私はコードの間違った部分に焦点を当てないように、さらに質問を編集しました。助けてくれてありがとう:-)私は将来の練習のためにすべてのコメントを書き留めましたが、今は私の任務の指示に従わなければなりません。注意すべきもう一つのことは、これは非常に基本的なJavaコースであり、私はノブです。 –

+0

もっとコードを投稿する必要があります。 –

答えて

8

場合は、whileループとだけインクリメントするforループを変更し、それがループ内からループの制御変数の値を変更することはお勧めできません。 (このような改変いくつかの他の言語では違法です。)

ループ内のループ反復変数を変更することにより、あなたはforループの使用によって提供される暗黙の仮定をいじっています。読者が見る場合、例えば:

for (int i = 0; i < 10; i++) { 
    // ... 
} 

読者は当然ループ(breakがそこに存在する場合に10を超えない、または、)正確に10回実行することを意図していると仮定する。しかし、ループ内でiの値を変更すると、この仮定はもはや有効ではありません。

あなたはカウンタの値を変更する必要がある場合は、私が代わりにwhileループとしてこれを書いてお勧めします:あなたがループし、どのような内iを変更している理由を説明したコメントと一緒に

int i = 0; 
while (i < 10) { 
    // ... 
    i++; 
} 

それはそうすることを意味します。

+0

ありがとうございます、あなたの答えは多くの助けと思われます。私は質問したいと思いますが、あなたが上に書いたもののためにループ内のカウンターを「悪い」だけだとか、もっと理由がありますか? –

+0

私はこれが主な理由だと言います。 Javaでは、ループ内で 'for'ループ制御変数を変更できない*技術的な理由はありません。つまり、コンパイラはこれを行うことができ、Javaのルール内で結果コードを推論することができます。しかし、コードは*書き込まれているよりも何度も*読み込まれる*ので、コード内で予期しない動作をして読者を驚かせないことは常に良い考えです。例えば、完全に合法ですが、関数がグローバル変数の値を変更していることを明確に示さずに変更することは、必ずしも良い考えではありません。 –

+1

ありがとう、それは役立ちます。私の大学ではそれがうまくいかないことを教える方法はたくさんあります。実際、教科書では、「whileループはあなたが決して使う必要のないものです」と言います(言い換えれば)。今、それはここの嘘だと思われます。 –

3

これは非常に悪い習慣です。それはJavaで厳密には違法ではないですが

codeList.contains(userCode)==true or userQuantity[i]!=0. 
1

混乱を避けるために、これは無限ループforループです(break文を使用)。私がfor-loopをやっている理由は、私が必要なためです。それは私のfor-loopのために状態が働いていないか、私は何か完全に間違っているのですか?

は、私はあなたの要件を(例えば、あなたがforループを使用するためにを必要としないされている)、またはあなたの思考に誤りがあることを誤解している感覚を持っています。カウンタが逆方向に進むことを伴わない単純な解決策が存在する。

(。。プログラミング演習は、最も経験豊富なJavaプログラマが同意するだろうコードを書くためにあなたを必要とすることは驚くべきことであることは悪いコードで簡単な説明は、それがないということです)

いずれかの方法:

  • forループ内のループ変数を変更することは、Gregによって記述された理由により悪いことです。

  • 「無限のループ」という考えは本当に奇妙です。以下は

    for (int i = 0; true; i++) { 
        ... 
    } 
    

    ...正当なJavaですが、それを書くための慣用的な方法は次のとおりです。

    int i = 0; 
    while (true) { 
        ... 
        i++; // ... at the appropriate point/points 
    } 
    

    ...ほとんどのケースでは、変数が行くようにする必要がありませんことを意味しています後ろ向きに。

+0

デリメータでwhileループを使用して全体を入れて、次回以降に問題がないかどうかを確認できます。 –

関連する問題