【问题标题】:Why do we structure else-if as such? [duplicate]为什么我们这样构建 else-if? [复制]
【发布时间】:2017-01-15 06:35:22
【问题描述】:

前几天我在思考“else-if”语句的创建以及为什么它的执行方式会导致每个事件都保证互斥。

例如:

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 为真时停止。我的直觉认为让上面的代码等价于这个会更自然:

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

因此,为什么我们要以我们的方式定义 else-if?是为了规避不必要的 if-else 语句嵌套吗?我只是认为它是模棱两可的,让它等同于我的第二个代码 sn-p 是有意义的。

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

编辑 2:我想我终于明白了我的问题的根本本质。通常,“else”检查上述语句是否为假,如果是,则运行该语句。但是,在 elif 的情况下,它会在运行之前检查上述所有语句是否为假。这与重复的问题不同,因为它询问的是 if-else 本身的性质,而不是它的详尽性。

编辑 3:我打开了一个新问题,希望更清楚,找到 here

【问题讨论】:

  • 没有人阻止您使用嵌套方法。
  • 如果条件B、C、D不互斥,你的代码片段的执行结果会不一样。
  • 虽然它们并不总是一样的。
  • 基于 C 语法的语言(如 Java)实际上并没有“else-if”语句。它们有“if-else”,其中“else”部分可以包含另一个“if-else”。
  • 正如@DYZ 所说,您显示的两个 sn-ps 是不等价的。而且可能更糟糕的是,第二个 sn-p 不遵循您在第一个 sn-p 的 cmets 中设置的规则。

标签: java


【解决方案1】:

人们更喜欢一种风格而不是另一种风格的原因是为了在测试条件时确保存在或不存在互斥。

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

  • ...在第一种情况下,由于 else if 语句的互斥性,只有条件 B 会触发。
  • ...在第二种情况下,条件 B、C 和 D 将触发,因为它们由于 if 语句而相互排斥。

最终这取决于你想做什么。您可能希望以这种方式运行多个语句。但是,您可能不会。以一种相互排斥的方式来塑造你的陈述可以确保当你得到一个你没有预料到的结果或状态时,你不会遇到奇怪的逻辑错误。

【讨论】:

  • 这有帮助,谢谢!所以这不是嵌套,而是一种更优雅的方式来强制互斥?
  • @rb612:我几乎认为switchreturnbreak(取决于您对结果所做的事情)将更有助于澄清这一点在很多情况下。但同样,它确实取决于您想要或必须与这种情况下的逻辑做什么。我在专业和爱好开发中看到,您通常想要相互排斥的事件(因此第一个模式),但第二个模式有它的位置。
【解决方案2】:

如果您采用嵌套方法并始终如一地应用它,您实际上会想出这个:

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”通常意味着如果上面的陈述是假的,执行,但在 elifs 的情况下,它是说,“如果以上说法均为假,请执行”。
【解决方案3】:

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

假设,你想根据学生的分数给一个分数,分数是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 GradeA Grade,这是不正确的。

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

【讨论】:

  • 当然,谢谢您的回答。我确实知道它们是不同的,我只是想知道为什么第一个示例与第二个示例的运行方式不同(由于语言处理 else-if 的方式)
  • 感谢您的回答和编辑。请查看我对问题的编辑,因为我认为这将有助于澄清我到底不明白什么。
  • 是的,你终于明白是对的。 else 只检查不满足上述条件并执行,但else..if 检查不满足上述所有条件。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
  • 2018-09-19
  • 2021-01-12
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 2012-10-22
相关资源
最近更新 更多