有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有不可检查else的java IF语句

你能解释一下为什么下面显示的方法是由Java编译和运行的吗

public static void testIf(int v){
   if (v < 10)   

   if (v >20 )  
     System.out.println(" 20 IF");
   else        
     System.out.println(" 20 ELSE");

   else        
     System.out.println("10 Else");
}
  • 通常每个IF都应该与最近的ELSE链接,为什么最后一个ELSE不是悬挂的ELSE?而且与假设有联系
  • 最后一个是无法访问的,为什么允许

提前感谢您的帮助

真诚地


共 (6) 个答案

  1. # 1 楼答案

    如果没有大括号,if可以接受一条语句——在本例中是if-else。因此,第一个else匹配内部if,第二个else匹配外部if。添加大括号并正确缩进代码使其更易于理解:

    if (v < 10) {
        if (v >20) {
            System.out.println(" 20 IF");
        } else {
            System.out.println(" 20 ELSE");
        }
    else {
        System.out.println("10 Else");
    }
    
  2. # 2 楼答案

    第二个{}属于第一个{},第二个{}和第一个{}属于第一个{}

  3. # 3 楼答案

    否则匹配如果

    如果使用格式化程序,它将显示哪些If和else匹配:

    public static void testIf(int v) {
        if (v < 10)
    
            if (v > 20)
                System.out.println(" 20 IF");
            else
                System.out.println(" 20 ELSE");
    
        else
            System.out.println("10 Else");
    }
    

    你的假设“通常每个IF都应该与最接近的其他IF链接”并不完全正确。如果不使用花括号,If和else的主体是紧跟其后的第一条语句。这种情况发生在第二个最里面的if(见下面的规则)上,然后发生在第一个if上

    Java如何选择要使用的其他工具将在Java Language Specification中讨论。特别是悬空else(其中有两个if和一个else)的情况,其解决方法如下:

    The Java programming language, like C and C++ and many programming languages before them, arbitrarily decrees that an else clause belongs to the innermost if to which it might possibly belong.

    当然,您的示例就是为什么您应该在每个if语句中添加花括号(和缩进),因为这样更清楚

    可达性

    在您的示例中,不可能达到“20if”语句,因为它要求V既小于10又大于20。虽然Java确实有一些无法访问的代码,但这并不是针对所有可能无法访问的条件的优化。Java Language Specification显示完成了哪些检查

    有很多规则,但对于控制语句,它们只查看表达式是否为有效常量(始终为true或false)。对于if语句,甚至未执行此检查,因此它们可用于禁用一段代码:

    This approach would be consistent with the treatment of other control structures. However, in order to allow the if statement to be used conveniently for "conditional compilation" purposes, the actual rules differ.

  4. # 4 楼答案

    工作原理是这样的,如果v小于10,你应该得到打印值10

    public static void testIf(int v){
       if (v < 10) {  
           if (v >20 ) {  
               System.out.println(" 20 IF");
           } else {      
               System.out.println(" 20 ELSE");
           }
       } else {       
           System.out.println("10 Else");
       }
    }
    

    编辑:如果没有任何大括号,它看起来像这样;不知道如何格式化,所以请容忍我

    public static void testIf(int v){
       if (v < 10)
           if (v >20 ) System.out.println(" 20 IF");
           else System.out.println(" 20 ELSE");
       else System.out.println("10 Else");
    }
    
  5. # 5 楼答案

    你中间的if else挡块

    if (v >20 )  
        System.out.println(" 20 IF");
    else        
        System.out.println(" 20 ELSE");
    

    java将其视为外部if的内部块。我的意思是,您的代码编译为:

    if (v < 10){ 
        if (v >20 )  
            System.out.println(" 20 IF");
        else        
            System.out.println(" 20 ELSE");
    }
    else        
        System.out.println("10 Else");
    
  6. # 6 楼答案

    Normally every IF should be linked with the closest ELSE, why the last else is not a dangling ELSE? Moreover with what IF is linked.

    如果你能很好地格式化你的代码,那就更有意义了

    if (v < 10)
    
                if (v > 20)
                    System.out.println(" 20 IF");
                else
                    System.out.println(" 20 ELSE");
    
     else
         System.out.println("10 Else");
    

    完全可以。因为当您没有{}时,只有一行代码绑定到作用域ifif。然而,在您的例子中,if后面的下一行是另一行if,因此范围仍然有效

    然而,这种逻辑看起来并不太好。但是代码仍然可以很好地执行

    正如其他人指出的那样,为了让世界幸福,人们总是喜欢使用{}

    The last ELSE is not reachable, why it's allowed?

    如果您的v>= 10是可访问的