-2

この単純な Java コードを見てみましょう。

class A {
    public static void main(String[] args) {
        if (1 == 1)
            if (2 == 2)
                if (2 != 2) // <-- should end here and do nothing
                    System.out.println("2 != 2");
            else
                System.out.println("2 != 2");
        else
            System.out.println("1 != 1");
    }
}

コメントにあるように、1==1、 then2==2が表示されるはずですが、最もネストされた条件2!=2が失敗するため、プログラムは何も出力せずに終了します。しかし、そうではなく、次のように書かれています2!=2

$ javac A.java && java A
2 != 2

なんで?

不思議なことに、Python では期待どおりに動作します。

>>> if (1 == 1):
...     if (2 == 2):
...         if (2 != 2):
...             print("2 != 2");
...     else:
...         print("2 != 2");
... else:
...     print("1 != 1");
... 
>>> 
4

5 に答える 5

9

正しいインデント ( Eclipse ではCtrl+ Shift+ F) を使用すると、結果が次のように見える理由がわかります2 != 2

class A {
    public static void main(String[] args) {
        if (1 == 1) // true
            if (2 == 2) // true
                if (2 != 2) // false
                    System.out.println("2 != 2");
                else
                    System.out.println("2 != 2"); // is actually 2 == 2, gets executed
            else
                System.out.println("1 != 1"); // is actually 2 != 2
    }
}

おそらく、スペースが重要な Python のバックグラウンドがあるでしょう。Java ではそれらは重要ではなく、実行に影響を与えずに配置できます。このようにステートメントを記述ifすると、Java はそれらをインデントではなく内部的にネストします (HTML タグのように - last if、first else など)。

これを防ぐには、(常に) Java で中括弧を使用し、自動書式設定 (前述のように Eclipse ではCtrl+ Shift+ ) を使用する必要があります。Fこれは読みやすさに役立ちます。ところで: Java で中かっこを使用しない場合、次の行のみが影響を受けifます。複数のステートメントを実行する必要があるたびに、中かっこを追加する必要があります。したがって、ブレースは拡張性も向上します。いつでもステートメントを追加でき、後で追加する必要がないからです。

于 2013-05-24T20:26:14.977 に答える
9

コードをインデントして中括弧を追加するだけです:

class A {
    public static void main(String[] args) {
        if (1 == 1) {
            if (2 == 2) {
                if (2 != 2) {
                    System.out.println("2 != 2");
                } else {
                    //comes here
                    System.out.println("2 != 2");
                }
            } else {
                System.out.println("1 != 1");
            }
        }
    }
}

ifこれが、Java でコーディングする場合、1 行または1for文の場合でも中括弧を使用することを強くお勧めする理由です。

于 2013-05-24T20:21:00.677 に答える
5

Java コードに他にぶら下がっている問題があります。

ifJava では、インデントはどのステートメントとelse結合するかに影響しません。いつも一番近いです。

これは、if ステートメントと else ステートメントの本体を中かっこで囲むことで解決できます。この問題は、ifステートメントの本文を常に中かっこで囲むことで回避できます。

public static void main(String[] args) {
    if (1 == 1) {
        if (2 == 2) {
            if (2 != 2) // <-- should end here and do nothing
                System.out.println("2 != 2");
        }
        else {
            System.out.println("2 != 2");
        }
    }
    else {
        System.out.println("1 != 1");
    }
}
于 2013-05-24T20:21:08.697 に答える
0

興味深いことに、ここで他のポスターが語ったように、java else は最も近いものに一致します。しかし、他のステートメントがある場合は、次のようにします。

        if (1 == 1)
            if (2 == 2)
                if (2 != 2) // <-- should end here and do nothing
                    System.out.println("2 != 2");
        System.out.println("out of inner if loop !");
        else
            System.out.println("2 != 2");
            else
                System.out.println("1 != 1");

その場合、system.out ステートメントは最も外側の if ステートメントと同じレベルにあり、else ステートメントにエラーが発生します。これは、java が else を if に一致させることができないためです。それが、Javaで中括弧が必要な理由です。

于 2013-05-24T21:22:25.430 に答える
0

Java では常に中かっこを使用します。Python とは異なり、読みやすさ以外はインデントは重要ではありません。

于 2013-05-24T20:24:04.473 に答える