假设我需要在最内层循环内的某个事件发生时立即中断三个或四个嵌套for循环.这样做的方法是什么?
我做的是使用这样的标志:
int i, j, k;
int flag1 = 0;
int flag2 = 0;
for (i = 0; i < 100; i++) {
for (j = 0; j < 100; j++) {
for (k = 0; k < 100; k++) {
if (k == 50) {
flag1 = 1;
flag2 = 1;
break;
}
}
if (flag1 == 1)break;
}
if (flag2 == 1)break;
}
Run Code Online (Sandbox Code Playgroud)
我认为这不是特别整洁.
你会如何完成同样的事情?(没有使用跳跃)
Tes*_*est 85
使用转到.它干净而简单.
Foo*_*ole 49
将所有循环放在函数中,然后返回而不是中断.
Asa*_*aph 17
如果您正在使用Java,则可以将标签与每个块关联,然后在continue语句后引用标签.例如:
outerfor:
for (int i=0; i<5; i++) {
innerfor:
for (int j=0; j<5; j++) {
if (i == 1 && j == 2) {
continue outerfor;
}
}
}Run Code Online (Sandbox Code Playgroud)
Chr*_*utz 14
你会如何完成同样的事情?(没有使用跳跃)
为什么?没有什么是普遍的邪恶,每一个附加工具都有其用途(除外gets()).使用goto此处使您的代码看起来更清晰,并且是我们唯一的选择之一(假设C).看:
int i, j, k;
for (i = 0; i < 100; i++) {
for (j = 0; j < 100; j++) {
for (k = 0; k < 100; k++) {
if (k == 50) {
goto END;
}
}
}
}
END:
Run Code Online (Sandbox Code Playgroud)
比所有这些标志变量更清晰,它甚至可以更清楚地显示您的代码正在做什么.
只是一点点好.
int i, j, k;
int flag1 = 0;
int flag2 = 0;
for (i = 0; i < 100 && !flag2; i++) {
for (j = 0; j < 100 && !flag1; j++) {
for (k = 0; k < 100; k++) {
if (k == 50) {
flag1 = 1;
flag2 = 1;
break;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是如果你确实需要这些循环,那么为了便于阅读,在每个循环中明确声明必须保持哪些条件才能继续循环.
小智 5
goto. 这是goto适当工具的极少数地方之一,通常是提出的论点为什么goto不是完全邪恶的。
不过,有时我会这样做:
void foo() {
bar_t *b = make_bar();
foo_helper(bar);
free_bar(b);
}
void foo_helper(bar_t *b) {
int i,j;
for (i=0; i < imax; i++) {
for (j=0; j < jmax; j++) {
if (uhoh(i, j) {
return;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这个想法是我得到一个保证的免费酒吧,而且我通过返回获得了一个干净的两级突破。