下面代码为了使当bTest为真时跳出3层循环,须3次判断 bTest ! (每加一层循环就得多一次 bTest 判断!!!)。 请问,不用goto语句,能不能一次判断 bTest 为真后直接跳出两层循环? 若能怎么实现? 如果有其它好方法更好(不用goto语句!)。void main()
{
  ...
  bool   bTest;
  ...
  while(ture) //第1层循环
  {
     ...
     while(true)//第2层循环
     {
        ...
        while(true)//第3层循环
        {
          ...
          if(bTest)
          break; //如果bTest为真,跳出此内层循环。(第1次判断)
          ...
        }
      if(bTest)
        break;//如果bTest为真,跳出此外层循环。(第2次判断)
      ...
     }
     if(bTest)
        break;//如果bTest为真,跳出此外层循环。(第3次判断)
     ...
  }
  ...
}

解决方案 »

  1.   

    void main()
    {
      ...
      bool   bTest = FALSE;
      ...
      while(!bTest) //第1层循环
      {
         ...
         while(!bTest)//第2层循环
         {
            ...
            while(!bTest)//第3层循环
            {
              ...
              ...
            }
          ...
         }
         ...
      }
      ...
    }
      

  2.   

    如果在这种情况下都不用goto,真不知道goto存在的理由?
      

  3.   

    把循环做成函数体,然后为TRUE时就直接return.
      

  4.   

    除了你的循环语句外,你的函数代码行数应该不会太长,用goto不会影响到程序结构。
      

  5.   

    如果仅仅都有了一个专门的bool变量用于进行三层循环嵌套,那么就可以使用楼上的兄弟们说的方法,如果三层循环嵌套都是根据不同的条件进行的,那么可以使用抛出异常的方式!
      

  6.   

    嵌套太多好像不是好的结构
    用goto算了
      

  7.   

    用这种方法试试:
    try
    {
    for(int i=0;i<100;i++)
    {
    for(int j=0;j<100;j++)
    {
    for(int k=0;k<100;k++)
    {
    throw "heeh";
    }
    }
    } }
    catch (char* str)
    {
    AfxMessageBox(str);
    }
      

  8.   

    不用goto的原因是为了不破坏程序的结构完整性,使程序更加容易读
    我认为写程序要懂得变通,这样不用goto更加使程序难懂~~~
      

  9.   

    还是比较同意zjh824(想做程序员的业余选手) 的方法,做成函数,到时直接RETURN出来就完了.
      

  10.   

    把循环做成函数体,然后为TRUE时就直接return
    同意
      

  11.   

    The __leave keywordThe __leave keyword is valid within a try-finally statement block. The effect of __leave is to jump to the end of the try-finally block. The termination handler is immediately executed. Although a goto statement can be used to accomplish the same result, a goto statement causes stack unwinding. The __leave statement is more efficient because it does not involve stack unwinding. 
      

  12.   

       异常也可以控制程序流程, 同意 lzzqqq(Jonersen) .
      

  13.   

    1. goto 就是在这个时候用的2. 使用异常其实和goto原理是一样的。
      

  14.   

    while(ture)  中的ture用变量来代替不行吗?
         当需要跳出循环时,修改变量的值为假
    但这种方法有弊端
    还是用goto比较好
      

  15.   

    使用return和goto就有了区别吗?!
    还不是一样, 汇编出来还是jmp 语句异常也是和goto等价的同意那句: 这个时候还不用goto,就干脆取消这个语句算了
      

  16.   

    代码都这样了,goto一下无妨,异常的想法也很好,不过为什么不直接一点呢?
      

  17.   

    return 和 goto 是不一样的return对应的汇编指令是ret执行效率低于jmp
      

  18.   

    这种情况只有 goto 可读性好。不滥用 goto 。 不代表不能用看情况
      

  19.   

    把循环做成函数体,然后为TRUE时就直接return.
    ===========================================
    同意这种情况只有 goto 可读性好。不滥用 goto 。 不代表不能用看情况
    ==============================================================
    同意,too
      

  20.   

    用异常来控制对于性能要求很高的程序来说是毛招。
    C++不支持 多循环直接跳出到最外层。
    goto再这种情况下反而提高了可读性和效率,为什么不用?
      

  21.   

    zhpzh (求新) :
        请问:为何你不想用goto?
    如果这种代码都不用goto,那我想你还是放弃做程序员吧,脑筋太死板了!
      

  22.   

    把里层的做为inline函数的比较好
      

  23.   

    楼主补充: 每个if(bTest){...}里除了"break;"还有其它处理,如下:
    void main()
    {
      ...
      bool   bTest;
      ...
      while(ture) //第1层循环
      {
         ...
         while(true)//第2层循环
         {
            ...
            while(true)//第3层循环
            {
              ...
              if(bTest)
              {
               ... //还有其它处理
               break; //如果bTest为真,跳出此内层循环。(第1次判断)
              }
              ...
            }
           if(bTest)
           {
             ... //还有其它处理
             break; //如果bTest为真,跳出此内层循环。(第2次判断)
           }
          ...
         }
         if(bTest)
         {
            ... //还有其它处理
            break; //如果bTest为真,跳出此内层循环。(第3次判断)
         }
         ...
      }
      ...
    }