无限循环和早期返回声明

Max*_*xpm 4 c++ infinite-loop

我有一个简单的控制台应用程序,它输出一个菜单并等待用户输入.执行适当的操作后,整个过程重复进行.输入特定字符串时,程序退出.这是通过无限循环和早期返回语句实现的:

int main()
{
    while (true)
    {
        OutputMenu();

        string UserChoice;
        cin >> UserChoice;

        // ...

        if (UserChoice == "exit") return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

根据我的老师的说法,使用无限循环并使用return语句破解我的方法是不好的做法.他建议如下:

int main()
{
    bool ShouldExit = false;
    while (!ShouldExit)
    {
        OutputMenu();

        string UserChoice;
        cin >> UserChoice;

        // ...

        if (UserChoice == "exit") ShouldExit = true;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  • 使用无限循环和早期返回语句真的是一个坏主意吗?
  • 如果是这样,是技术原因还是仅仅是不好的做法?

CB *_*ley 11

这可能do...while是适当的罕见情况之一.我避免添加额外的布尔状态变量,除非它们真正使代码更清晰.

int main()
{
    string UserChoice;
    do
    {
        OutputMenu();

        cin >> UserChoice;

        // ...

    } while (UserChoice != "exit");
}
Run Code Online (Sandbox Code Playgroud)

但是,对于用户输入循环,我通常会创建一个函数来返回输入是否成功.如果cin关闭,代码很容易以无限循环结束.

例如

bool GetNonExitInput( std::istream& in, std::string& s )
{
    OutputMenu();
    in >> s;

    return in.good() && s != "exit";
}


int main()
{
    std::string UserChoice;

    while (GetNonExitInput(std::cin, UserChoice))
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

  • +1次更正,以在do {} while循环开始之前移动“ UserChoice”的声明。 (2认同)

Con*_*tah 7

真的要么很好,但你需要做你教授想要的.你会发现它在工业上也是一样的.一些公司可能有一个编码标准,规定花括号在一个新的线上,而其他公司希望他们从开始阻止的线开始.没有真正的理由选择一个而不是另一个,所以最好只选择领导者想要的东西.


Naw*_*waz 6

这两种方法的唯一区别在于,在第二种方法中,在退出while循环后仍然可以执行某些操作,而在第一种方法中,您将从函数本身返回; 你之后什么也做不了while.

但是,我会建议这个简单的代码:您可以使用break如下代码来维护变量:

while (true)
{
       //your code

       if (UserChoice == "exit") 
            break;

       //your code
}
Run Code Online (Sandbox Code Playgroud)

ShouldExit不再需要变量了!


Bil*_*eal 5

取决于语言.如果你用C语言写作,那么"一个入口,一个退出"的理念是有意义的 - 你想要一个地方,你正在清理一个函数使用的资源,这样你就没有机会忘记以后了.如果您使用的是C++,那么无论如何您应该使用RAII进行清理,在这种情况下,我完全不同意您的老师.return根据需要使用s,以使代码尽可能清晰.

(虽然我会使用for (;;)而不是while (true)在C++中生成无限循环)