我已经使用C++ SDL几天了,我遇到了一个有趣的问题。
SDL_Event event1;
while(SDL_WaitEvent(&event1))
{
    for(size_t i = 0; i < MainMenuOptions.size();i++)
    {
        if(event1.button.x > MainMenuOptions.at(i).GetX() && event1.button.x < (MainMenuOptions.at(i).GetX() + MainMenuOptions.at(i).GetWidth())  
        && event1.button.y > MainMenuOptions.at(i).GetY()  && event1.button.y < (MainMenuOptions.at(i).GetY() + MainMenuOptions.at(i).GetHeight()))
        {
            break;
        }
    }
}当我在for循环中使用break时,它会中断for循环,而不是while循环。我如何在不使用goto语句的情况下中断while循环呢?(我听说goto语句是糟糕的编程)
发布于 2012-08-20 16:18:15
这个问题还有另一个答案,我想我应该在每个人都反对我之前说出来。使用变量当然是一种“好”的方法。然而,仅仅为了跳出循环而创建额外的变量似乎有点过头了,对吧?
所以,是的,这次goto是完美的解决方案。很清楚你在用它做什么,你没有使用另一个变量,代码保持简短,可维护和可读性。
goto语句是糟糕的实践,基本上是基本时代的残余,当时它是改变代码流的唯一方法。然而,现在我们“知道得更清楚了”,并且说goto或任何其他结构都不好,这并不能解决问题。对于你试图用它解决的一个特定问题来说,这可能是不好的(人们试图用goto解决的大多数问题也是如此)。但是,在适当的情况下(就像这里),这是可以的。当然,我不想在这里开始辩论。Goto就像一个非常强大的工具(例如,大锤)。它有它的用途,你不能说一个工具是完全不好的;它是用户以错误的方式使用它。
发布于 2012-08-20 16:56:09
常见的解决方案是将这些东西放入它自己的函数中并从中返回:
inline SDL_Event do_it()
{
    SDL_Event event;
    while(SDL_WaitEvent(&event))
        for(std::size_t i = 0; i < MainMenuOptions.size(); ++i)
            if(/*...*/)
                return event;
    return event; // or whatever else suits, I know too little about your code
}发布于 2012-08-20 16:15:12
使用变量指示是否需要退出:
bool exit_program = false;
while( !exit_program && SDL_WaitEvent(&event1) )
{
    for( /* ... */ )
    {
        exit_program = true;
    }
}https://stackoverflow.com/questions/12034241
复制相似问题