为什么循环没有中断?

Why is the loop not breaking?

我写了这个简单的菜单,它一直运行到我选择退出为止。每个选择函数只显示它被选中的消息。每个函数都放在 while (true) 循环中的 switch 语句中。它应该在函数运行一次后中断,但我得到了无限循环。我已经用 else if 语句尝试过它并且它工作正常。我想使用 switch,因为它看起来干净且易于管理。请告诉我逻辑错误,我会修复它。

#include <iostream>
#include <limits>


bool validation(int testChoice, int minC, int maxC, std::string message)
{
    bool invalid = false;

    if ((std::cin.fail())|| (testChoice >maxC) || (testChoice < minC))
    {
        std::cout << message <<std::endl;
        invalid = true;
    std::cin.clear();
    std::cin.ignore(INT_MAX, '\n');
    }
    return invalid;
}

int menu()
{
   bool flag = true;
   int testChoice;
   int minC = 1, maxC = 8;
   do
   {
        std::cout <<"Which test to run?: \n";
        std::cout <<"1.  Test1 \n";
        std::cout <<"2.  Test2 \n";
        std::cout <<"3.  Test3 \n";
        std::cout <<"4.  Test4 \n";
        std::cout <<"5.  Test5 \n";
        std::cout <<"6.  Test6 \n";
        std::cout <<"7.  test7 \n";
        std::cout <<"8.  Quit \n";
        std::cout <<"Pick one: ";
        std::string message = "1-8 only: ";
        std::cin >> testChoice;
       flag = validation(testChoice, minC, maxC, message);
   }
   while(flag);
   return testChoice;
}
void test1()
{
    std::cout <<"Test 1 was chosen\n";
}
void test2()
{
    std::cout <<"Test 2 was chosen\n";
}
void test3()
{
    std::cout <<"Test 3 was chosen\n";
}
void test4()
{
    std::cout <<"Test 4 was chosen\n";
}
void test5()
{
    std::cout <<"Test 5 was chosen\n";
}
void test6()
{
    std::cout <<"Test 6 was chosen\n";
}
void test7()
{
    std::cout <<"Test 7 was chosen\n";
}
int toRun(int testChoice) //Pass in the return value from menu
{
   while (true)
   {

    switch(testChoice)
    {
        case 1:
        test1();
        break;

        case 2:
        test2();
        break;

        case 3:
        test3();
        break;

        case 4:
        test4();
        break;

        case 5:
        test5();
        break;

        case 6:
        test6();
        break;

        case 7:
        test7();
        break;
        case 8:
        return 0;

    }
   }
}
int main ()
{
    int choice = menu();
    toRun(choice);
    return 0;
}





您不会在 while (true) 中请求新的输入,因此它永远不会命中 return 语句,除非最初给出 8。要解决此问题,只需更新循环内的 testChoice 变量即可。一个可能的解决方案是:

int toRun() // No parameter needed now
{
   while (true)
   {
       int testChoice = menu();
       switch(testChoice)
       {
           …

如果您希望它只 运行 一次,则完全删除 while 循环。

请注意 switch 内的 break 只会中断开关,而不是整个 while 循环!

switch 语句在执行测试用例后中断但循环继续,因为它的条件是 true 并且其他地方没有中断或 return 语句,除了 returncase 8。这是您的代码可以正常工作的唯一情况。

I have tried it with else if statements and it worked properly.

这是因为在这种情况下 break 会中断您的 while 循环,而不是像 switch 语句那样中断 case

解法:

完全删除 while 循环,只保留其中的内容。您在那里不需要循环,实际循环发生在菜单内部(即 do-while 循环)。此外,为每个案例添加适当的 return 语句。目前,只有 case 8 有一个 return 语句。此外,我没有看到您使用 toRun 的 return 值。您也可以将其设为 void 并完全避免那些 return 语句。