关于java:我们为什么要构造其他 – 如果是这样的话?

Why do we structure else-if as such?

本问题已经有最佳答案,请猛点这里访问。

前几天我在想"else if"语句的创建,以及为什么它的执行方式会导致每个事件都被保证是互斥的。

例如:

1
2
3
4
5
6
7
8
if(condition A)
    //condition
else if(condition B)
    //will run if condition A is false and condition B is true
else if(condition C)
    //will run if condition A is false and condition B is false and condition C is true
else if(condition D)
    //will run if all the above conditions are false and condition D is true.

我认为如果条件A不是真的,检查所有"else"语句更有意义,如果条件B或条件C是真的,就不只是停下来。我的直觉认为,让上面的代码等价于这个更自然:

1
2
3
4
5
6
7
8
9
10
if(condition A)
    //condition
else {
    if(condition B)
    //...
    if(condition C)
    //...
    if(condition D)
    //...
}

因此,如果我们这样做,为什么我们要定义其他呢?是为了避免不必要的if-else语句嵌套吗?我只是觉得这是模棱两可的,有必要让它等同于我的第二个代码片段。

编辑:为了消除困惑,我完全理解这两个陈述并不总是等价的。我的问题主要是问,如果定义的第一个语句并不总是等价于第二个语句,为什么还要这样做?我在试着理解为什么如果按它的方式运行。

编辑2:我想我终于理解了我问题的本质。通常,"else"检查上面的语句是否为假,如果为假,则运行该语句。但是,在elif的情况下,它会在运行之前检查上面的所有语句是否都是假的。这与重复的问题不同,因为它问的是"如果不是"本身的性质,而不是它的完备性。

编辑3:我打开了一个新的问题,希望能更清楚地发现这里。


一种风格比另一种更受欢迎的原因是,在测试条件时,要确保存在或没有相互排斥。

如果条件B、C或D彼此不互斥,那么……

  • …在第一种情况下,由于else if声明的相互排他性,只有条件B才会触发。
  • …在第二种情况下,条件b、c和d将被触发,因为它们不是由于if声明而相互排斥的。

最终,这取决于你想做什么。您可能希望以这种方式运行多个语句。但是,您可能不会这样做。以互斥的方式设计您的语句可以确保您在得到您不期望的结果或状态时不会遇到奇怪的逻辑错误。


如果您采用嵌套方法,并不断地应用它,那么实际上您会想到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (condition A) {
    // A
} else {
    if (condition B) {
        // B
    } else {
        if (condition C) {
            // C
        } else {
            if (condition D) {
                // D
            }
        }
    }
}

每个if都以同样的方式处理。第一个if语句没有从所有其他if语句中删除else块的特殊能力。你所建议的语法使else的意思不一致。


让我们举一个基本的例子。

假设你想根据学生的分数给一个分数,分数是60。

1
2
3
4
5
6
7
if(score <= 50) {
   System.out.println("C Grade");
} else if(score <= 70) {
   System.out.println("B Grade");
} else if(score <= 100) {
   System.out.println("A Grade");
}

它将打印B Grade

1
2
3
4
5
6
7
8
9
10
if(score<=50) {
   System.out.println("C Grade");
} else {
    if(score <= 70) {
        System.out.println("B Grade");
    }
    if(score <= 100) {
        System.out.println("A Grade");
    }
}

现在,根据你们的说法,如果我们遵循上述方法,条件并不相互排斥。它将打印B GradeA Grade,这不是真的。

因此,如果if中的条件不是互斥的,则会遇到问题。这就是为什么需要用if..else筑巢。