【问题标题】:How to loop back to the beginning of a switch statement after a case案例后如何循环回到switch语句的开头
【发布时间】:2012-10-26 14:58:06
【问题描述】:

我确定这是一个简单的问题,但我无法弄清楚。在下面的代码中,我希望能够让案例 5 之后重新显示选项。我怎样才能做到这一点?提前致谢!

// Input the race of your character
    cout << "Choose a race here: " << endl
    << "1) Human, 2) Elf, 3) Dark Dwarf, 4) Commoner, 5) Race info, 6) Admin Debug Race : ";

    cin >> mCharRace;

    switch (mCharRace)
        {
        case 1:
        cout << "You have chosen Human!" << endl;
        mExpPoints = 999;
        mArmor = mArmor + 2;
        break;
    case 2:
        cout << "You have chosen Elf!" << endl;
        mAccuracy = mAccuracy + 2;
        mWeapon.mDamageRange.mLow = mWeapon.mDamageRange.mLow + 1;
        break;
    case 3:
        cout << "You have chosen Dark Dwarf!" << endl;
        mWeapon.mDamageRange.mHigh = mWeapon.mDamageRange.mHigh + 2;
        mMaxHitPoints = mMaxHitPoints + 3;
        break;
    case 4:
        cout << "You have chosen Commoner! Brave man." << endl;
        mAccuracy       = mAccuracy - 3;
        mHitPoints      = mHitPoints - 5;
        mMaxHitPoints   = 8;
        mExpPoints      = -250;
        mNextLevelExp   = 1500;
        mArmor          = -1;
        break;
    case 5:
        cout << "Placeholder for explanation text." << endl;
        break;
    case 6:
        cout << "ADMIN POWERS UNITE!!!!!!!" << endl;
        mAccuracy       = 20;
        mHitPoints      = 1000;
        mMaxHitPoints   = 1000;
        mExpPoints      = 0;
        mNextLevelExp   = 1000;
        mArmor          = 100;
        mWeapon.mName   = "Admin Sword of HNNNG!";
        mWeapon.mDamageRange.mLow   = 100;
        mWeapon.mDamageRange.mHigh  = 150;
        mGold           = 1000000;
        break;

【问题讨论】:

标签: c++ loops switch-statement


【解决方案1】:

switch-case 构造不是迭代构造。它只能选择特定的 case 并执行它。因此,控制流无法恢复。

所以,你不能用它来循环。 将其包装在 whilefor 循环结构中。

while(condition){
   switch (mCharRace){
   ...
   ...
   }
}

当您想停止循环时,只需将 condition 设置为 false

【讨论】:

    【解决方案2】:

    将输入和切换代码包装在一个循环中,并分配一个变量exitLoop 以退出循环。默认情况下将该变量设置为 TRUE,除非在您想要重复输入的情况下。在其中,将exitLoop 设置为 false。

    【讨论】:

      【解决方案3】:

      在你的第一个 cout 之前添加一个标签

      label:
      
      cout << "Choose a race here: " << endl
      << "1) Human, 2) Elf, 3) Dark Dwarf, 4) Commoner, 5) Race info, 6) Admin Debug Race : ";
      
      cin >> mCharRace;
      ...
      

      然后在case 5里面,添加

      goto label;
      

      【讨论】:

      • 你一定会喜欢汇编程序,cjamesm :-) 在所有其他情况下,请不要使用 goto(我没有投反对票)
      • goto 在 C++ 中一般应避免使用。有它的用途,但这个并不适合。
      • @Jan:这是一个古老的辩论,我不会参与。我会坚持我所说的:有它的用途,但一般应该避免。
      • 感谢关于 goto 的提示,伙计们。我直到最近才知道它的存在,现在我想我会继续忘记它..!
      【解决方案4】:

      将它放在for(;;) 循环中并使用continue 而不是break。在 switch 语句的末尾添加另一个 break 以捕获真正想要中断的情况:

      for (;;)
      {
          switch (x)
          {
          case case_that_wants_to_loop:
              // ...
              continue;
          case case_that_wants_to_break:
              // ...
              break;
          }
          break;
      }
      

      【讨论】:

      • @downvoter 这种技术用于商业口译员。它比其他方法效率高得多,尤其是那些使用布尔变量的方法。
      猜你喜欢
      • 1970-01-01
      • 2015-01-10
      • 2013-10-26
      • 1970-01-01
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      • 2010-10-23
      相关资源
      最近更新 更多