如下代码,在3层for循环里,当条件2满足时,就要跳出这3层循环,重新执行while循环,
这里用的是goto语句来跳出的,条件2不满足就要执行goto过去的代码后再重新while循环,
要怎么改成不用goto语句的呢?
while(1){
if(条件1){
//跳出while循环
break;
}
for(i=0; i<7; i++)
{
for(j=0; j<7; j++)
{
for(k=0; k<7; k++)
{
if(条件2)
{
goto a;
}
}
}
}
a:
if(i == 7)
{
...
} else {
break;
}
}
我觉得你已经进入了思维的误区了,C语言在当初开发过程中既然设定了有goto语句这个功能,就是为了满足一些特殊场景,
在这种场景中,使用goto语句能够很好的解决问题,并且使代码简洁,只不过在新手开发过程中,理解代码执行的流程能力较弱,此时使用goto语句
容易引起流程混乱,所以书上说尽量不要使用goto语句。
但是并没有说不能使用,你只需要把跳转语句标识写的标准、易懂一些就行,比如 FUNNAME_goto_break_sig,这样才能使程序更加健壮。
看了其它的人的方法,觉得都没有你原来的代码简洁,不是吗?
方法一:
while(1)
{
bool bJumpFlag_1 = false;
bool bJumpFlag_2 = false;
if(条件1)
{
//跳出while循环
break;
}
for(i = 0; i < 7; i++)
{
for(j = 0; j < 7; j++)
{
for(k = 0; k < 7; k++)
{
if(条件2)
{
if(i == 7)
{
//需要执行的代码
bJumpFlag_1 = true;
}
else
{
bJumpFlag_2 = true;
}
break;
}
}
if(bJumpFlag_1 == true)
break;
}
if(bJumFlag_1 == true)
break;
}
if(bJumpFlag_2 == true)
break;
}
GOTO语句某些时候用用是可以的,我之前就用过,没什么事情
只能在 j 层循环判断 k 值,如果 k 值比设定值小,说明是 break,出来的,再继续 break,然后再在 i 层判断 j 值,继续 break;
看来还是逃不了用goto的命
方法一:
while(1)
{
bool bJumpFlag_1 = false;
bool bJumpFlag_2 = false;
if(条件1)
{
//跳出while循环
break;
}
for(i = 0; i < 7; i++)
{
for(j = 0; j < 7; j++)
{
for(k = 0; k < 7; k++)
{
if(条件2)
{
if(i == 7)
{
//需要执行的代码
bJumpFlag_1 = true;
}
else
{
bJumpFlag_2 = true;
}
break;
}
}
if(bJumpFlag_1 == true || bJompFlag_2 == true) 刚刚漏了bJumpFlag_2
break;
}
if(bJumpFlag_1 == true || bJompFlag_2 == true) 刚刚漏了bJumpFlag_2
break;
}
if(bJumpFlag_2 == true)
break;
}
嵌入汇编
用汇编里面的跳转语句
也可以达到goto语句的作用
可以通过设置标签flag来跳出循环
goto 语句要慎用,但不是不能用,它其实就是汇编里的jmp指令,跳转很高效直接,但 会破坏程序的模块化和可读性。这个是可以取舍的。
其实java里提供的break语句也是可以加标签的,就是goto的限制性替换。
可以通过设置标签flag来跳出循环,转向另外一个
把要用到的代码代替goto就好
bool flag_i = 0;
while(1){
if(条件1){
//跳出while循环
break;
}
for(i=0; i<7; i++)
{
for(j=0; j<7; j++)
{
for(k=0; k<7; k++)
{
if(条件2)
{
flag_i = i;
i = 7;
j = 7;
break;
}
}
}
}
if( flag_i== 7 )
{
...
} else {
break;
}
}