良许Linux教程网 干货合集 如何避免循环中“突兀”的break和continue

如何避免循环中“突兀”的break和continue

循环中经常使用到的continue、break和return是一些常见的控制语句,它们可以在特定条件下改变程序的执行流程。

然而,在循环中过度使用这些控制语句可能会导致代码逻辑复杂,也容易引发错误。因此,在使用这些语句时需要注意一些细节。

在循环语句(如for和while)中使用return语句是合理的,不会出现问题。但是,如果使用了continue或者break语句,循环的逻辑和终止条件就变得复杂了,尤其是在一些复杂的情况下,很难确保其正确性。

为什么需要使用continue或者break呢?可以这样说,当我们在编写代码时使用continue或者break时,往往是因为没有清楚思考循环的逻辑。理论上讲,如果我们在编写代码时考虑周全,几乎不需要使用continue或者break(如果你有反例,请指出)。

那么该怎么办呢?对于确实需要使用这些语句的情况,我们应该考虑重写循环,使代码看起来更简洁和易于理解。这样可以避免过分依赖这些控制语句带来的复杂性和潜在的错误。

怎么改写continue或者break?

下面我对这些情况举一些例子。

情况1

下面这段代码里面有一个continue:

pTrans = findTranss(pSM, evt);
for(evt=0;evtif (evt == BadNum)
  {
    continue;
  }
  pSM->state = pTrans->nextState;
  ...
} 

解释:如果其中一个事件等于一个坏的事件数,那么将跳过去,执行下一个状态。为了知道它到底在干什么,这里continue会导致一些语句被跳过了。

含有continue和break的循环不是那么容易理解,它们依靠控制流来描述逻辑,结果到最后很容易导致我们不能充分理解其中的涵义。

其实,我们只需要把continue的条件反向,这段代码就可以很容易的被转换成等价的,不含continue的代码:

pTrans = findTranss(pSM, evt);
for(evt=0;evtif (evt != BadNum)
  {
      pSM->state = pTrans->nextState;
      ...
  }
}

pSM->state = pTrans->nextState;和之后的代码全部被放到了if里面,多了一层缩进,然而continue却没有了。这样正面的描述就会更加清晰。

情况2

当 break 语句出现在一个for和while循环内时,循环会立即终止,且程序流将继续执行紧接着循环的下一条语句,break其实是给这个循环增加了一个退出条件。往往只需要把这个条件合并到循环头部,就可以去掉break。

比如下面这段代码,当condition2成立的时候,break就会退出循环:

while (condition1) {
  ...
  if (condition2) {
    break;
  }
}

我们只需要把condition2反转之后,放到while头部的终止条件,就可以去掉这种break语句。更改后的代码如下:

while (condition1 && !condition2) {
  ...
}

表面上这种情况只适用于break出现在循环开头或者末尾的时候,然而在大部分时候,break都可以通过某种方式,移动到循环的开头或者末尾。

情况3

很多break退出循环之后,其实接下来就是一个return。这种break往往可以直接换成return。比如下面这个例子:

_Bool eventState{
  _Bool result = false;
  pTrans = findTranss(pSM, evt);
  for(evt=0;evtif (evt == BadNum)
    {
        result = true;
        break;
    }
  }
  return result;
}

这个函数检查names链表里是否存在一个名字,包含“bad”这个词。它的循环里包含一个break语句。这个函数可以被改写成:

_Bool eventState{
  _Bool result = false;
  pTrans = findTranss(pSM, evt);
  for(evt=0;evtif (evt == BadNum)
    {
      return true;
    }
  }
  return false;
}

改进后的代码,当事件是坏的序号时,直接用return true返回,如果循环结束了还没有return,那就返回false。使用return来代替break,这样break语句和result这个变量,都一并被消除掉了。

可以说绝大部分的break和continue,都可以通过替换成return语句,或者翻转if条件的方式来消除掉,变换后的代码也会变得清晰很多。而一些含有复杂的逻辑的代码,也可以通过提取一个帮助函数来消除掉。

总结

经验总结几个点,去掉break和continue的代码变得容易理解,确保正确。

  1. 如果出现了continue,只需要把continue的条件反向,就可以消除continue。
  2. 如果出现了break,可以把break的条件,合并到循环头部的终止条件里,从而去掉break。
  3. 可以把break替换成return,从而去掉break。
  4. 如果以上都失败了,可以把循环里面复杂的部分提取出来,做一个帮助函数用来函数调用,之后continue或者break就可以去掉了。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部