开关内部的循环变为无穷大

loop inside switch becomes infinite

本文关键字:无穷大 循环 内部 开关      更新时间:2023-10-16

当程序进入第二个循环时,即使我将第二个环路的值设置为false,它也会变为无穷大。问题发生在哪里?第一个while循环我在退出时从未遇到任何问题,但第二个。。。我就是不知道在哪里,也不知道为什么。

int RareData::assignRareType()
{
    int switchType;
    std::cin >> switchType;
    bool valid = true;
    bool valid2 = true;
    while (valid)
    {
        switch (switchType)
        {
        case 0:
            std::cout << "1 - Character Changen2 - Account Changen3 - Bothn";
            int switchData;
            std::cin >> switchData;
            valid2 = true;
            while (valid2)
            {
                switch (switchData)
                {
                case 1:
                    valid2 = false;
                    std::cin.clear();
                    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
                    assignCharacter();
                    break;
                case 2:
                    valid2 = false;
                    std::cin.clear();
                        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
                    assignAccount();
                    break;
                case 3:
                    valid2 = false;
                    std::cin.clear();
                    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
                    assignAccount();
                    assignCharacter();
                    break;
                default:
                    std::cout << "Options only range from 1-3n1 - Character Changen2 - Account Changen3 - Bothn";
                    std::cin.clear();
                    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
                    std::cin >> switchData;
                }
            }
            break;
        default:
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
            std::cin >> switchType;
        }
    }
    return 0;
}

您将valid2设置为false,但valid仍然为true。所以你的第一个while循环一遍又一遍。执行顺序如下:

while(valid) == true
    case 0:
           get switchdata, set valid2 = true
                second while loop
                 break
Repeat because valid is always true, switchtype never changes.

变量valid被初始化为true,并且从未更改,因此实际上是第一个while循环从未终止,而不是第二个。