Do ... while循环即使在不满足条件时也会循环

时间:2015-02-09 07:56:22

标签: c++ console-application do-while

我正在编写一个简单的rpg控制台游戏,我将使用图形等开发加班。但是现在我遇到了我的问题... while循环问题。我不经常使用它们,但我认为这对于这种必要性是好的。基本上,我有一个开场故事,然后我给用户四个选项,他们可以通过按“1”,“2”,“3”或“4”输入。如果用户键入其他内容,则应显示消息,并允许用户键入正确的输入。我的代码如下:

int action; // Used to determine what the user wants to do.
cout << "Story goes here\n\n";
cout << "What would you like to do? (1/2/3/4)\n\n";
cout << "1. Do this\n";
cout << "2. Do that\n";
cout << "3. Do this that\n";
cout << "4. Party\n\n";

cin >> action;

do
{
  switch (action)
  {
    case 1:
      cout << "1\n";
      break;
    case 2:
      cout << "2\n";
      break;
    case 3:
      cout << "3\n";
      break;
    case 4:
      cout << "4\n";
      break;
    default:
      cout << "I'm sorry, but I'm not sure what you want to do. Please tell me again using the corresponding number. (1/2/3/4)\n\n";
      cin >> action;
      break;
  }
} while ((action != 1) || (action != 2) || (action != 3) || (action != 4));
system("pause");

现在我已经测试了如果输入5或6会发生什么,它会显示默认消息并允许我再试一次,但是,如果我键入1,2,3或4,它会进入交换机并继续输出打印出来的号码。它永远不会结束。我在MS Visual Studio 2013 Express中使用c ++。

我也使用了调试器,它表示动作等于2(或者我按下的任何数字)并继续运行循环。我不确定为什么会这样。

4 个答案:

答案 0 :(得分:3)

变化

while ((action != 1) || (action != 2) || (action != 3) || (action != 4)); // (1)

while ((action != 1) && (action != 2) && (action != 3) && (action != 4)); // (2)

<强>分析:

如果action == 1

(1)将评估为

while(false || true || true || true)

=&GT;

while (true)

(2)将评估为

while(false && true && true && true)

=&GT;

while (false)

答案 1 :(得分:1)

这非常笨拙,因为您基本上必须两次测试条件。 (您的具体问题是布尔测试不正确:您需要&&而不是||。)

考虑使用函数而不是内置验证:

int getAction(void)
{
    for (;;)/*infinite loop idiom*/{
        int action; /*scope as local as possible*/
        cin >> action;
        if (action >=1 || action <= 4){
            return action; /*this is ok, so return*/
        }
        cout << "I'm sorry, but I'm not sure what you want to do. Please tell me again using the corresponding number. (1/2/3/4)\n\n";
    }
}

答案 2 :(得分:0)

代替“或”条件尝试“和”条件 它会解决你的问题

答案 3 :(得分:0)

它只是在默认情况下暂停,因为您要求输入和分配操作。

你应该在循环之前初始化动作。一旦分配了动作1,2,3,4,它将永远循环,因为这就是代码所要做的。你永远不会再改变它的值,所以while语句一直在旋转。

在你的case语句中,你需要做任何需要的操作,如果你想退出循环,在while上添加一个退出标志。 Break只是标记case语句的结尾,以阻止它运行到下一个语句。