0

私は、if ... else ifステートメントが短絡されているという前提でプログラミングを行ってきました。つまり、条件がステートメントを満たす場合、ifそのelse ifステートメントは参照されません。私のプログラムでの最近の行動は、それを疑問視しています。配列を反復処理し、配列内の各値がそのインデックス +1 と一致するかどうかを確認するコードは次のとおりです。

        int[] boardCopy = this.getBoard();
        int length = boardCopy.length;
        for (int i = 0; i < length; i++) {
            //blank space must be in last position
            if (boardCopy[i] == 0 && i != length -1) return false;
            //out of order if value does not match index + 1 (zero indexed)
            else if (boardCopy[i] != i +1) {
                System.out.println("Out of order: " + boardCopy[i] + ", " + (i+1));
                return false;
            }
        }
        return true;

これが私がテストしているアレイです:

int[] blocks = {1, 2, 3, 4, 5, 6, 7, 8, 0};

順序どおりのボードを作成すると (値がインデックス + 1 に一致し、かつ 0 が最後の位置にある)、 が返されますfalse。私の印刷ステートメントは、ステートメントのロジックが満たされelse ifているにもかかわらず、ステートメントが 0 の位置をチェックしていることを示しています。if

ロジック フローに関する私の全体的な概念はif/elseif間違っていますか? 私のコードビューは粉砕されようとしていますか?

4

3 に答える 3

1

コメントセクションでこの広告を無限に議論するのではなくprintln、次の点で追加することをお勧めします...

  • forループの最初の行(最初のifの前)
  • 最初の前にreturn false-あなたは明らかにこのブロックをで区切る必要があります{}

この印刷には、、、の値が表示されiますboardCopy[i]length

また、同じものを表示している最後のelseブロックを含めます。println

それぞれを識別してprintln、どの行が印刷されているかを確認します(たとえば、プレフィックス1: 2:など)

私は出力が啓発されるとかなり確信しています:)

于 2013-03-05T14:23:54.667 に答える
1
if (boardCopy[i] == 0 && i != length -1) return false;
    //out of order if value does not match index + 1 (zero indexed)
    else if (boardCopy[i] != i +1) {
        System.out.println("Out of order: " + boardCopy[i] + ", " + (i+1));
        return false;
    }
    return true;
}

上記のコードを次で実行します。

int[] blocks = {1, 2, 3, 4, 5, 6, 7, 8, 0};

これはlength = 9.

ここで、数字を調べると、最初の if ステートメントは 0 になるまでブロックされません。if ステートメントの最初の条件はTrue. 2 番目は: i != length -1、またはより適切に言えば:i != 8です。iループが 0 に到達した時点で、値は 8 に設定されています。最初のループでは i=0 であることを思い出してください。したがって、 if ステートメントは常に のセットで true になりますblocks

于 2013-03-05T14:24:04.023 に答える
1

あなたのロジックには欠陥があります: このコードを実行するとOut of order: 0, 9、有効な if-else ロジックである が生成されます。

最初i == 8の条件で8 != 9 - 1は false と評価されます。

次に、else 句がチェックされてからboard[8] != 9、「順不同」になります。

私はあなたが欲しいと思います

    for (int i = 0; i < length; i++) {
        //blank space must be in last position
        if (boardCopy[i] == 0) {
            if (i != length -1) {
                return false;
            }
            continue;   // can be in an else block or omitted
        }
        //out of order if value does not match index + 1 (zero indexed)
        else if (boardCopy[i] != i +1) {
            System.out.println("Out of order: " + boardCopy[i] + ", " + (i+1));
            return false;
        }
    }
于 2013-03-05T14:24:15.230 に答える