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

Pas*_*zza -4 c++ switch-statement

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

输入示例:

CerseiTyrion
Run Code Online (Sandbox Code Playgroud)

预期产量:

Cersei
Tyrion
Run Code Online (Sandbox Code Playgroud)

实际产量:

Cersei
Tyrion
Jon
Dany
Tyrion
Jon
Dany
Run Code Online (Sandbox Code Playgroud)

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

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

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;
      };
    }
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*eyA 5

您需要使用break语句完成switch case ,否则代码将继续到下一个case标签.

对一些人来说,反直觉,switch并不是美化多重if陈述,而是一种美化的goto陈述.每个案例标签的行为都像goto标签,如果不存在break,代码将继续执行.

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

switch (x) {
    case 1: // fall through
    case 2: work_one_or_two(); break;
    ...
}
Run Code Online (Sandbox Code Playgroud)