C++ SDL打破while循环

use*_*664 2 c c++

我已经在使用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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在for循环中使用break时,它将跳出for循环而不是while循环.如何在不使用goto语句的情况下突破while循环?(我听说goto语句编程错误)

sbi*_*sbi 11

常见的解决方案是将这些东西放入自己的函数中并从中返回:

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
}
Run Code Online (Sandbox Code Playgroud)


Bar*_*icz 7

还有另外一个答案,我认为我应该先说出来,然后每个人都会向我投降.使用变量肯定是一种"好"的方法.但是,创建额外的变量只是为了跳出循环似乎有点矫枉过正,对吧?

所以是的,这次goto是完美的解决方案.很清楚你在做什么,你没有使用另一个变量,代码仍然短,可维护和可读.

语句goto是不好的做法,大多是BASIC时代的残余,当时它是改变代码流的唯一方法.然而,现在我们"知道得更好",并说这个goto或任何其他结构是坏的,只是不削减它.对于你试图用它来解决的一个特定问题可能是坏事(并且人们试图用goto解决的大多数问题就是这种情况).但是,在适当的情况下(比如这里),没关系.当然,我不想在这里开始辩论.Goto就像一个非常强大的工具(例如,大锤).它有它的用途,你不能说工具是完全坏的; 这是用户以错误的方式使用它.

  • 任何`goto`总是比使用语言提供的结构语句的解决方案更糟糕:http://stackoverflow.com/a/12034773/140719在做C++二十多年的时间里,我还没有看到一个` goto`是必要的,我已经看到了_very_很少,它导致代码比替代品更容易维护.(这在C,BTW中是不同的,其中没有RAII和其他有用的结构.通常,如果有人坚持在C++中需要`goto`,他们实际上是在编写伪装成C++的C代码.) (2认同)