我已经在使用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)
还有另外一个答案,我认为我应该先说出来,然后每个人都会向我投降.使用变量肯定是一种"好"的方法.但是,创建额外的变量只是为了跳出循环似乎有点矫枉过正,对吧?
所以是的,这次goto是完美的解决方案.很清楚你在做什么,你没有使用另一个变量,代码仍然短,可维护和可读.
语句goto是不好的做法,大多是BASIC时代的残余,当时它是改变代码流的唯一方法.然而,现在我们"知道得更好",并说这个goto或任何其他结构是坏的,只是不削减它.对于你试图用它来解决的一个特定问题可能是坏事(并且人们试图用goto解决的大多数问题就是这种情况).但是,在适当的情况下(比如这里),没关系.当然,我不想在这里开始辩论.Goto就像一个非常强大的工具(例如,大锤).它有它的用途,你不能说工具是完全坏的; 这是用户以错误的方式使用它.