白桦yuma
2018-06-13 11:14
采纳率: 98.1%
浏览 2.1k
已采纳

c语言中怎样替换goto语句?

如下代码,在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;
                }

 }
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

12条回答 默认 最新

  • 一片树叶的幻想 2018-06-14 00:46
    已采纳

    我觉得你已经进入了思维的误区了,C语言在当初开发过程中既然设定了有goto语句这个功能,就是为了满足一些特殊场景,
    在这种场景中,使用goto语句能够很好的解决问题,并且使代码简洁,只不过在新手开发过程中,理解代码执行的流程能力较弱,此时使用goto语句
    容易引起流程混乱,所以书上说尽量不要使用goto语句。
    但是并没有说不能使用,你只需要把跳转语句标识写的标准、易懂一些就行,比如 FUNNAME_goto_break_sig,这样才能使程序更加健壮。
    看了其它的人的方法,觉得都没有你原来的代码简洁,不是吗?

    打赏 评论
  • wodexinhao 2018-06-13 12:21

    方法一:
    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;
    }

    1 打赏 评论
  • milk_216 2018-06-13 11:21

    只能在 j 层循环判断 k 值,如果 k 值比设定值小,说明是 break,出来的,再继续 break,然后再在 i 层判断 j 值,继续 break;

    打赏 评论
  • 白桦yuma 2018-06-13 12:16

    看来还是逃不了用goto的命

    打赏 评论
  • wodexinhao 2018-06-13 12:25

    方法一:
    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;
    }

    
    
    打赏 评论
  • fz_hh 2018-06-13 14:32

    嵌入汇编
    用汇编里面的跳转语句
    也可以达到goto语句的作用

    打赏 评论
  • qq_32810875 2018-06-14 01:50

    可以通过设置标签flag来跳出循环

    打赏 评论
  • 凯哥凯哥 2018-06-14 15:19

    goto 语句要慎用,但不是不能用,它其实就是汇编里的jmp指令,跳转很高效直接,但 会破坏程序的模块化和可读性。这个是可以取舍的。
    其实java里提供的break语句也是可以加标签的,就是goto的限制性替换。

    打赏 评论
  • 小蝌蚪借尾巴 2018-06-15 01:28

    GOTO语句某些时候用用是可以的,我之前就用过,没什么事情

    打赏 评论
  • sunandstarws 2018-06-15 01:40

    可以通过设置标签flag来跳出循环,转向另外一个

    打赏 评论
  • qq_40544166 2018-07-29 05:40

    把要用到的代码代替goto就好

    打赏 评论
  • 小敏工程 2018-06-26 01:29
    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;
                    }
    
     }
    
    
    1 打赏 评论

相关推荐 更多相似问题