有 Java 编程相关的问题?

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

java与else语句不一致?

这是我问题的修订版本

当使用elseif作为快捷方式时,我不太清楚为什么在语法方面,它执行与嵌套if-else语句相同的功能。假设你有以下几点:

int score = 80;
if(score < 80) {
  System.out.println("C Grade");
} else if(score < 90) {
  System.out.println("B Grade");
} else if(score < 100) {
  System.out.println("A Grade");
}

如果我添加一些缩进,我会得到类似的结果:

if(score < 80) {
  System.out.println("C Grade");
} else 
  if(score < 90) {
    System.out.println("B Grade");
  } else 
    if(score < 100) {
      System.out.println("A Grade");
    }

这与编写嵌套的if-else语句的计算结果相同:

if(score < 80) {
    System.out.println("C Grade");
} else { 
    if(score < 90) {
        System.out.println("B Grade");
    } else { 
        if(score < 100) {
        System.out.println("A Grade");
        }
    }
}

然而,我看到了一个重大区别。在第三个代码段中,“else”语句有括号,其余的if-else语句嵌套在这些括号内。在第一个场景中,没有封装括号。那么,如果我在嵌套if-else语句时似乎需要使用括号,那么为什么else-if的第一个想法有效呢?我认为缺少控制流语句(如if、else、while等)的方括号会导致编译器只计算以下行,例如:

if(condition)
    System.out.println("A");
    System.out.println("B");
//only prints "A"

共 (3) 个答案

  1. # 1 楼答案

    支架不是流量控制机构。它们主要是一种声明分组机制

    简单if{}语句的语法为:

    'if' '(' expression ')' statement 'else' statement
    

    “语句”可以是赋值语句、方法调用、嵌套的if等等。但是“陈述”不是两个陈述,也不是三个陈述,或者

    这就是{{}进入它的地方,因为

    '{' statement-list '}'
    

    实际上是statement根据Java语法规则。通过使用花括号,可以将(可能的)多个语句分组到单个语句中

    如果你将这些知识应用到你的例子中,你认为你看到的“神秘”行为将变得简单而直接

    对于记录,建议始终将{{}块与if语句和循环一起使用,因为这样可以使代码更易于阅读


    I thought that a lack of brackets with control flow statements such as if, else, while, etc. cause the compiler to only evaluate the following line.

    你得出了一个错误的结论。在Java语言中,它(几乎)与代码中换行符的含义无关。唯一的限制是,不能在标记的中间插入断线,如关键字、运算符、标识符和文字。{cda}和{cda}结束

    顺便说一句,通过像文本一样阅读和猜测语法来学习编程语言是一种糟糕的方法。你会有各种不正确的想法。更好的方法是阅读一本好的教科书,或该语言的官方教程材料

  2. # 2 楼答案

    如果没有括号,则使用下面的语句,而不仅仅是下面的

    if语句包括

    if (<condition>) <statement> else <statement>
    

    它是否写在几行上并不重要。通常,Java中的任何地方都可能出现换行符,在不改变含义的情况下允许使用空格(唯一的例外是字符串文本和单行注释)

  3. # 3 楼答案

    首先,请注意ifelse始终应用于它们后面的单个语句。您可以使用{ }将多个语句分组为一个复合语句,但条件语句随后应用于单个{ ... }语句

    考虑这两个等价的陈述:

    if (foo) {
      bar();
    }
    
    if (foo)
      bar();
    

    在第一种情况下if应用于{ }块(包含bar();),而在第二种情况下它直接应用于bar();语句。不太明显的是{ }并不是创建复合语句的唯一方法。事实上,if是另一个复合表达式,因此它可以是另一个ifelse语句的直接子语句。例如:

    if (foo)
      if (bar) {
        baz();
      }
    

    完全有效(如果难以阅读),相当于:

    if (foo) {
      if (bar) {
        baz();
      }
    }
    

    同样的概念也适用于else-如果前面的条件为false,那么它后面的任何语句都将被应用,即使该语句本身是一个复合语句

    if (foo) {
      bar();
    }
    else
      if (baz) {
        biff();
      }
    

    else适用于整个if (baz)块,因为它只是一个单一(复合)语句,所以不需要额外的{ }

    确切的语法在JLS §19中指定,不同形式的if语句的语法在JLS §14.9中详细说明。注意,这里没有提到else if,因为它不是语言的正式部分,只是语法的(有意的)结果


    所有这些都说明了,我们没有按照您描述的方式格式化代码的真正原因仅仅是因为它更难阅读。将else if视为单个关键字并相应缩进代码要简单得多。{a3}但它确实不需要像其他语言那样简化语法