切换案例“出现”不适用于C ++

时间:2017-08-28 19:13:13

标签: c++ switch-statement

基本上我的开关案例在那些我认为不符合的条件的语句中无法正常工作,无论如何都在执行。

示例输入:

CerseiTyrion

预期产出:

Cersei
Tyrion

实际输出:

Cersei
Tyrion
Jon
Dany
Tyrion
Jon
Dany

以下功能的目标是解析冒险游戏的一些输入文本,让游戏了解文本中包含的一些重要信息。然后它继续使用它发现的代码执行代码,如果满足某些条件,该代码应始终与函数的其余部分一起运行。

最小,完整;可验证的例子:

void HandleGameState( const std::string& text ) {

    enum Characters { 
        Cersei = 0x01, 
        Tyrion = 0x02,
        Jon    = 0x04,
        Dany   = 0x08
    };

    unsigned int mask = 1;

    switch( characterMask & mask )
    {
      case Cersei:
      {
        std::cout << "Cersei" << std::endl;
      };
      case Tyrion:
      {
        std::cout << "Tyrion" << std::endl;
      };
      case Jon:
      {
        std::cout << "Jon" << std::endl;
      };
      case Dany:
      {
        std::cout << "Dany" << std::endl;
      };
    }
}

2 个答案:

答案 0 :(得分:5)

您需要使用break语句完成切换案例,否则代码将继续到下一个案例标签。

对某些人来说,违反直觉,switch并不是一种荣耀的多if陈述,而是一种荣耀的goto陈述。每个案例标签的行为都与goto标签相似,如果没有break,代码就会继续执行。

这通常用于两个不同的案例标签需要产生相同输出的情况 - 而不是复制代码,标签只是一个接一个地放置。例如:

switch (x) {
    case 1: // fall through
    case 2: work_one_or_two(); break;
    ...
}

答案 1 :(得分:2)

您必须在每break后面使用case

切换/案例规则很简单,在mached案例之后,所有以下情况都将执行,直到休息;或者开关的结束。