为什么我们将else-if结构化为这样?

15 浏览
0 Comments

为什么我们将else-if结构化为这样?

最近我在思考"else-if"语句的创建以及为什么它的执行方式能确保每个事件都是互斥的。例如:

如果(condition A)

//条件

否则如果(condition B)

//如果条件A为假且条件B为真则执行

否则如果(condition C)

//如果条件A为假且条件B为假且条件C为真则执行

否则如果(condition D)

//如果以上所有条件都为假且条件D为真则执行

我认为如果条件A为假时,所有的"else"语句都应该被检查,而不仅仅是在条件B或C为真时停止。我直觉认为将上述代码等价于以下代码更为自然:

如果(condition A)

//条件

否则 {

如果(condition B)

//...

如果(condition C)

//...

如果(condition D)

//...

}

因此,我们为什么要这样定义else-if呢?是为了避免不必要的if-else嵌套吗?我认为这样的定义是模糊的,并且将其等效为我的第二段代码会更合理。

编辑:为了消除混淆,我完全理解这两个语句并不总是等价的。我的问题主要是询问为什么else-if被定义为第一个语句不总是等价于第二个语句?我试图理解else-if运行的原因。

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

编辑3:我提出了一个新的问题,希望更清楚,可以在这里找到。

0
0 Comments

为什么我们要将else-if结构构造成这样?

在上面的例子中,假设你想根据学生的分数给予一个等级,而分数是60分。

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`。

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 Grade`和`A Grade`,这是不正确的。

因此,在if条件中条件不是互斥的情况下,你会遇到问题。这就是为什么需要嵌套`if..else`的原因。

当然,谢谢你的回答。我确实明白它们是不同的,我只是想知道为什么第一个例子不像第二个例子那样运行(由于语言处理else-if的方式)

谢谢你的回答和编辑。请看一下我对问题的编辑,因为我认为这将有助于澄清我不明白的地方。

是的,你最后理解的是正确的。`else`只是检查上面的条件是否不满足并执行,但`else..if`检查上面的所有条件是否不满足。 🙂

0
0 Comments

我们为什么要这样结构化else-if?

如果按照嵌套的方式来处理,你可能会得到这样的结果:

if (condition A) {
    // A
} else {
    if (condition B) {
        // B
    } else {
        if (condition C) {
            // C
        } else {
            if (condition D) {
                // D
            }
        }
    }
}

每个if语句都会被同样对待。第一个if语句并没有特殊的能力来从所有其他if语句中移除else块。你提出的语法给else赋予了不一致的含义。

好的,是的,我认为你已经接近了我问题的核心 - "else"通常意味着如果上述语句为假,则执行,但在elif的情况下,它表示"如果上述所有语句都为假,则执行"。

问题的出现原因是else在elif语句中的含义与通常的else语句不一致。在通常的else语句中,它表示如果上述条件为假,则执行。但在elif语句中,它表示如果所有以上条件都为假,则执行。

为了解决这个问题,我们需要重新考虑elif语句的结构。一种解决方法是引入一个新的关键字,比如"elseif",用于表示在所有以上条件都为假的情况下执行的代码块。这样可以清楚地表达elif语句的含义,避免了else的歧义。

通过这种方式重新结构elif语句,我们可以更加清晰地表达代码的逻辑,避免了else的不一致含义带来的困惑。这样的语法结构也更加符合人们对代码逻辑的直觉理解,提高了代码的可读性和可维护性。

0
0 Comments

为什么我们要以这种方式结构化else-if?

在编写代码时,我们可能会遇到多个条件需要判断,而这些条件可能存在相互排斥或者不相互排斥的情况。通过不同的结构化方式,可以确保条件的相互排斥性或者非排斥性。

如果条件B、C或D之间互相排斥,那么...

  • ...在第一种情况下,只有条件B会被执行,因为else-if的结构保证了条件的相互排斥性。
  • ...在第二种情况下,条件B、C和D都会被执行,因为它们之间不是相互排斥的。

最终,选择哪种结构取决于你想要实现什么。你可能希望以这种方式执行多个语句,但也可能不需要。通过确保条件的相互排斥性,可以避免在获得意外结果或状态时遇到奇怪的逻辑错误。

谢谢,这对我有帮助!所以,这种结构化方式实质上是一种更优雅的方式来强制实现条件的相互排斥性?

我几乎可以说,在许多情况下,使用带有返回或中断语句的switch语句更有助于澄清这一点。但再次强调,这取决于你在这种情况下想要或必须要做的逻辑操作。在专业和业余开发中,我通常建议使用互斥事件(因此是第一种模式),但第二种模式也有其适用的场景。

0