【问题标题】:how does this switch block executes?这个 switch 块是如何执行的?
【发布时间】:2016-11-23 12:56:26
【问题描述】:
#include<bits/stdc++.h>
using namespace std;

void show(int errorCause)
{
    switch(errorCause)
    {
        case 1:
        {
            cout<<"in 1\n";
            break;
        }

        case 2: break;

        case 3:
        {
            cout<<"in 3\n";
            break;

            case 4: 
            {
                cout<<"in 4\n";
                case 5: cout<<"in 5\n";
                    break;
            }
        }
        break;

        default: 
        {
            cout<<"in deafult\n";
            break;
       }
    }
    return;
}

int main()
{
    show(5);
    return 0;
}

我使用了这个代码示例,但我无法弄清楚它的流程。根据我的说法,它应该匹配默认条件,因为 errorCause 不匹配任何内容,但它的输出是:

in 5

我不明白为什么它不会进入默认状态?

这是我的构建环境详细信息:

编译器: g++ 4.8.4版(Ubuntu 4.8.4-2ubuntu1~14.04.3)

系统: Ubuntu 14.04(64 位)

【问题讨论】:

  • 请格式化你的代码...如果我想象成编译器,我会拒绝直接阅读和解析这段代码。
  • 调试器是完美的,当你试图理解代码流时——你可以一步一步地通过一个程序。

标签: c++ linux g++


【解决方案1】:

你通过了5,为什么switch语句不应该进入'case 5'?

为了清楚起见:删除开关块内的所有这些花括号,它们都不是必需的。重新对齐和格式化代码,应该就清楚了。

【讨论】:

  • 问题是,如果代码格式正确,您会看到导致 OP 混乱的原因 - 一些 case 语句位于不同级别的大括号​​内。但实际上是允许的。
  • 是的,我已经看到了,而且我知道花括号对于到达 case 语句并不重要,因此,对于初学者并且不这样做的人来说,不是 知道所有这些东西:去掉花括号。
  • 嗯,是的,如果你去掉花括号,问题就消失了。但这并不能解释为什么带花括号的代码是可以的。
【解决方案2】:

case/default 标签可以出现在switch 语句中的任何位置,嵌套的switch 语句中除外。

这种用法的一个著名例子是 Duff's device 用于展开循环:

void copy(unsigned char *to, const unsigned char *from, size_t count)
{
    size_t n;

    if (!count)
        return;

    n = (count + 7) / 8;
    switch (count % 8) {
    case 0:
        do {
            *to++ = *from++;
    case 1:
            *to++ = *from++;
    case 2:
            *to++ = *from++;
    case 3:
            *to++ = *from++;
    case 4:
            *to++ = *from++;
    case 5:
            *to++ = *from++;
    case 6:
            *to++ = *from++;
    case 7:
            *to++ = *from++;
    case 1:
        } while (--n > 0);
    }
}

(改编自原文)。

乍一看,这没有任何意义(如果您允许编译器为您展开循环,这有点多余),但它说明case 标签可以或多或少地放置在您喜欢的位置switch 声明。

【讨论】:

    【解决方案3】:

    首先,不要编写这样的代码。

    其次,它到达case 5: 的原因仅仅是在switch 语句中有一个case 5:。嵌套在两层花括号内没关系;它只是代码跳转到的标签。它不必位于 switch 语句的外层。

    【讨论】:

      【解决方案4】:

      这是因为实际上 switch 语句评估是“宽松的”,所以大括号在那里无关紧要。只有case 很重要,但您可以通过case 直接跳到作用域的中间(甚至可以跳到循环的中间,参见Duff's device)。

      【讨论】:

        【解决方案5】:

        因为您传递的值是 5 ,与 switch case 参数完全匹配。

        案例5:cout

        如果要获取默认语句,则修改main函数如下图:

          int main()
        {
          show(6);
          return 0;
        }
        

        希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多