use*_*379 81 c break nested-loops
如果我使用一个break语句,它只会破坏内部循环,我需要使用一些标志来打破外部循环.但是如果有许多嵌套循环,代码看起来不会很好.
还有其他方法可以打破所有循环吗?(请不要使用goto stmt.)
for(int i = 0; i < 1000; i++) {
for(int j = 0; j < 1000; j++) {
if(condition) {
// both of the loops need to break and control will go to stmt2
}
}
}
stmt2
Run Code Online (Sandbox Code Playgroud)
Sri*_*aju 165
不,不要破坏乐趣break.这是最后剩余的有效使用goto;)
如果不是这样,那么你可以使用标志来打破深嵌套循环.
打破嵌套循环的另一种方法是将两个循环分解为单独的函数,并在要退出时从该函数返回.
总结 - 打破嵌套循环:
goto忍不住在这里包括xkcd :)

Goto被认为是有害的,但评论中的许多人认为它不一定是有害的.如果明智地使用它可以是一个很好的工具.适度使用的任何东西都很有趣.
小智 41
关于什么:
if (condition) {
i = j = 1000;
break;
}
Run Code Online (Sandbox Code Playgroud)
Tun*_*ung 34
bool stop = false;
for (int i = 0; (i < 1000) && !stop; i++)
{
for (int j = 0; (j < 1000) && !stop; j++)
{
if (condition)
stop = true;
}
}
Run Code Online (Sandbox Code Playgroud)
Jay*_*Jay 23
一种方法是将所有嵌套循环放入一个函数中,并从最内层循环返回,需要打破所有循环.
function()
{
for(int i=0; i<1000; i++)
{
for(int j=0; j<1000;j++)
{
if (condition)
return;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Ren*_*K N 16
我认为goto会解决问题
for(int i = 0; i < 1000; i++) {
for(int j = 0; j < 1000; i++) {
if (condition) {
goto end;
}
}
}
end:
stmt2
Run Code Online (Sandbox Code Playgroud)
Jac*_*ack 12
如果你想要它可读,你需要一个布尔变量:
bool broke = false;
for(int i = 0; i < 1000; i++) {
for(int j = 0; j < 1000; i++) {
if (condition) {
broke = true;
break;
}
}
if (broke)
break;
}
Run Code Online (Sandbox Code Playgroud)
如果您希望它具有较低的可读性,您可以加入布尔评估:
bool broke = false;
for(int i = 0; i < 1000 && !broke; i++) {
for(int j = 0; j < 1000; i++) {
if (condition) {
broke = true;
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
作为一种终极方式,您可以使初始循环无效:
for(int i = 0; i < size; i++) {
for(int j = 0; j < 1000; i++) {
if (condition) {
i = size;
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用LLVM团队的这个明智的建议:
"将谓词循环转换为谓词函数"
看到:
http://llvm.org/docs/CodingStandards.html#turn-predicate-loops-into-predicate-functions
注意:这个答案显示了一个真正晦涩的结构。
如果您使用 GCC,请查看此库。就像在 PHP 中一样,break可以接受要退出的嵌套循环数。你可以这样写:
for(int i = 0; i < 1000; i++) {
for(int j = 0; j < 1000; j++) {
if(condition) {
// break two nested enclosing loops
break(2);
}
}
}
Run Code Online (Sandbox Code Playgroud)