【问题标题】:Why are these two statements equivalent为什么这两个语句是等价的
【发布时间】:2018-01-21 14:42:18
【问题描述】:

所以我的问题基本上与 switch 语句有关。为什么是

switch (foo) {
    case 1: case 2:
        bar();
        break;
}

同:

if (foo == 1 || foo == 2) {
    bar();
}

在我看来,使用 switch 语句,案例 1 下的代码将执行,而案例 2 下的代码将被忽略。请向我解释为什么不是这样。

【问题讨论】:

  • 您在这里指的是什么语言?请添加相关标签。
  • 你查过开关是如何工作的吗?在我所知道的每一种语言中,除非用break 分隔,否则每种情况不会单独执行。 case 1“落入”case 2
  • 假设是 Java,去这里搜索“fall through”的页面:docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

标签: if-statement switch-statement logic


【解决方案1】:

在评估case 语句时,代码将fall through 直到块终止(通常由break 语句终止)。所以第一个sn-p的语义如下:

  • 如果foo2,则执行bar() 然后中断。
  • 如果foo1,则执行case 1:后面的block,它是空的(即什么也不做),然后继续(fall through)到case 2:后面的block,详见上一点
  • 对于任何其他值,什么都不做(因为没有匹配的 case 块。

如您所见,这相当于在foo12 的情况下执行bar()

【讨论】:

    【解决方案2】:

    break; 语句完全负责跳出 switch 代码块。

    没有break; 语句的switch 语句将以非常奇怪的顺序执行。

      switch (2) {
        case 2:
           alert("hello");
        case 3: 
            alert("goodbye");
            break;
        case 4:
             alert("will never show");
      }
    

    JavaScript 切换语句:https://www.w3schools.com/js/js_switch.asp

    【讨论】:

      【解决方案3】:

      在每个 case 语句的末尾添加 break; 以阻止 case 执行它下面的所有内容。否则,它会失败。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-24
        • 2018-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-12
        • 1970-01-01
        相关资源
        最近更新 更多