为什么这个Java程序使用嵌套ifs声明2!= 2?

Dog*_*Dog -2 java boolean-logic if-statement nested

让我们看看这个简单的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");
    }
}
Run Code Online (Sandbox Code Playgroud)

正如评论所说,它应该看到1==1,然后2==2,最嵌套的条件2!=2失败,所以程序退出而不打印任何东西.但事实并非如此,相反它说2!=2:

$ javac A.java && java A
2 != 2
Run Code Online (Sandbox Code Playgroud)

为什么?

奇怪的是,它在Python中按预期工作:

>>> if (1 == 1):
...     if (2 == 2):
...         if (2 != 2):
...             print("2 != 2");
...     else:
...         print("2 != 2");
... else:
...     print("1 != 1");
... 
>>> 
Run Code Online (Sandbox Code Playgroud)

Lui*_*oza 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");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是为什么强烈建议使用Java编码即使你有一行iffor一句话也要使用大括号.


lor*_*rey 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
    }
}
Run Code Online (Sandbox Code Playgroud)

你可能有一个空间重要的Python背景.在Java中,它们并不重要,可以放置而不会对执行产生影响.如果您编写这样的if语句,Java将在内部嵌套而不是缩进(就像HTML标记一样 - 最后是if,first else等等).

为了防止这种情况,你应该(总是)在Java中使用大括号并使用自动格式化(如上所述在Eclipse中使用Ctrl+ Shift+ F).这有助于提高可读性.顺便说一句:如果你不在Java中使用大括号,只有以下行受到影响if.然后,每次需要执行多个语句时,都必须添加大括号.因此,大括号也可以提高可扩展性,因为您可以随时添加语句,而不必在以后添加它们.


And*_*mas 5

您在Java代码中有一个悬空的问题.

在Java中,缩进不会影响连接的if语句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");
    }
}
Run Code Online (Sandbox Code Playgroud)