【问题标题】:Why does this code print 0223?为什么此代码打印 0223?
【发布时间】:2018-04-11 22:54:19
【问题描述】:

为什么情况 2 在这个 for 循环中会被计算两次?

for (int x = 0; x <4; x++)
{
    switch (x)
    {
        case 2: printf("%d", x);
        case 0: printf("%d", x);
        default: break;
        case 3: printf("%d", x);
    }
}

编辑:我忘了补充一点,这不是一段合法的代码。只是上周我朋友的工作考试中出现的问题。

【问题讨论】:

  • 您想在每个case 的末尾添加break。否则,在找到break 之前,它不会按预期工作并命中每个案例。

标签: c++ c for-loop switch-statement


【解决方案1】:

案例 2 不会被评估两次:它只被评估一次。但是,如果您不使用 break 语句结束一个案例,而不是离开 switch,则会继续执行下一个案例。

换句话说,当x 为2 时,执行跳转到case 2 并在x = 2 时调用printf("%d", x)。然后,执行落到case 0,并在x 仍然等于2 时调用printf("%d", x) . 然后,执行到default 的情况下,它遇到break 语句并最终离开switch。

【讨论】:

  • 那么当x = 2时,即使条件不满足,case 0也会被执行?
  • 在 C 中,case 不是保护执行的条件。它更像是一个goto 标签。
  • @Ozymandias case 0 在case 2 下方编码。如果没有break,则从case 2 开始的执行流程会落入case 0。交换case的顺序,当x=2时你不会再看到case 0被执行了,但是当x=0时你会看到case 2被执行了
【解决方案2】:

它没有。这些案件没有中断。这就是为什么它先打印 case 2 然后再打印 case 0。

【讨论】:

    猜你喜欢
    • 2014-11-23
    • 2017-02-08
    • 2017-03-02
    • 2023-02-26
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多