责编 | 欧阳姝黎

出品 | CSDN(ID:CSDNnews)

循环里Continue,Break,Return经常会用到,也是很容易出错的一个坑,之前在循环里continue,break,return的作用,你知道吗? 说到过各自的用法,存在即合理,说能使用或者坚决不用没意义,这不是教条主义,但也有需要注意的地方,来打自己脸了。

循环语句(for,while)里面出现return是没什么问题的,但是如果使用了continue或者break语句,那么就会使得循环的逻辑和终止条件变得有些复杂起来了,尤其是在一些裸机比较绕的地方,难以保证其正确性。

为什么需要用continue或者break?

可以这么说,写代码的时候continue或者break的使用,往往是对循环的逻辑没有想的特别清楚。如果写代码的时候考虑周全了,理论上说是几乎不需要continue或者break的(欢迎举例反驳)。

那怎么办呢?有些逻辑确实也是需要,这种情况如果循环里出现了continue或者break,我们就应该考虑改写这个循环,让代码看着更简单易懂。

怎么改写continue或者break?

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

情况1

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

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

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

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

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

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

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

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

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

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

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

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

情况2

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

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

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

情况3

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

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

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

_Bool eventState{_Bool result = false;pTrans = findTranss(pSM, evt);for(evt=0;evt<StateNum;evt++){if (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就可以去掉了。

☞美团优选、多多买菜等五家社区团购被罚650万元;打车手机越贵,接单车型越贵;微软推出低代码语言 Power Fx | 极客头条
☞Google 重磅发布 Flutter 2 !一套代码横扫 5 大系统
☞亚马逊力推以太坊,微软谷歌准备跟进!
☞三年白干!程序员孙某因违反《竞业协议》赔偿腾讯 97.6 万元,返还 15.8 万元

如何避免循环中“突兀”的break和continue相关推荐

  1. 循环中的自变量-break和continue

    1.break 作用:break 用于终止循环的执行, 过程:当执行到break语句后,程序将跳出循环,执行循环语句后边的代码 i=1 while i<10:if i==5:breakprint ...

  2. python教程07-while语句的基本使用、for...in循环的使用、break与continue、打印矩形三角形九九乘法表、基础题、进阶题

    python教程_小白入门/2020/7/20 行百里者半九十,你可一定要坚持下去啊 前几天家里有事更新给耽误了,后续会稳定更新的,一起加油! 学习目标 文章目录 python教程_小白入门/2020 ...

  3. python中continue只结束本次循环_循环(while,break,continue),转义字符

    Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待 4999元包邮 去购买 > 01. 程序的三大流程 在程序开发中,一共有三种流程方式: 顺序 - ...

  4. php 常量 循环 1,php循环控制break、continue语句、goto语句和php常量

    1.循环控制break语句: break结束当前 for,while,do-while 或者switch 结构的执行. Break可以接受一个可选的数字参数来决定跳出几重循环. $i = 0; whi ...

  5. java continue goto_Java中goto和break、continue实现区别

    goto 关键字很早就在程序设计语言中出现.事实上,goto 是汇编语言的程序控制结构的始祖:"若条件 A, 则跳到这里:否则跳到那里".若阅读由几乎所有编译器生成的汇编代码,就会 ...

  6. Delphi中exit、break、continue等跳出操作的区别

    Delphi中表示跳出的有break,continue,abort,exit,halt,runerror等 1.break 强制退出最近的一层循环(注意:只能放在循环里:而且是只能跳出最近的一层循环) ...

  7. do...while循环语句、死循环、循环的嵌套、Break、Continue

    1.do-while循环语句 格式: do{ 循环执行体 }while(循环条件); 注意该循环和while循环的区别: 当首次的循环条件结果是false,那么while循环的执行体是不执行的, 但是 ...

  8. python之while循环用法举例,break与continue的区别,格式化输出及运算符

    一.while循环的基本结构 while 条件: 代码块(循环体) else: 当上面的条件为假. 才会执行 执行顺序:判断条件是否为真. 如果真. 执行循环体. 然后再次判断条件....直到循环条件 ...

  9. jQuery中each的break和continue

    each实质上是一个for循环,那么能不能像普通的for循环那样break和continue呢? 参考http://bevisoft.iteye.com/blog/641195做了个实验,可以的, 代 ...

最新文章

  1. Ios应用网络安全之https
  2. 自己使用的Android框架
  3. 发福利了|最近发现深圳有一家公司提供的叫8ms的GUI平台不错,好用,最主要所有功能都是免费的
  4. Linux_PAM_用户之间的信息传递
  5. Kafka笔记--常用指令(新建、删除topic)
  6. android 模仿uc标签页,android模仿UC首页天气效果
  7. 【BZOJ】【3301】【USACO2011 Feb】Cow Line
  8. 从最大似然再看线性回归
  9. Ubuntu 18.04 root 使用ssh密钥远程登陆
  10. java四方支付系统
  11. android最新仿微信表情面板,Android高仿微信表情输入与键盘输入详解
  12. 关于华为S27000交换机在局域网中的一些简单配置
  13. 通信协议(一)——UART协议
  14. 小炫酷的3D旋转立方体相册
  15. ele组件上传图片--图片更换功能
  16. 很多人生哲理好句子分享
  17. python爬取网页数据软件,有哪些不错的爬虫软件是可以免费爬取网页数据的?
  18. 计算机文化基础第一章知识点题,计算机文化基础第一章习题与答案
  19. 广东某银行基于阿凡搭在信创环境下打造全行科技一体化服务平台
  20. 目标检测篇之---YOLO系列

热门文章

  1. 【WCF】WCF简介
  2. OSI七层模型详解 TCP/IP协议
  3. 移动端 js 弹出层内容滚动的时候,不影响body的滚动条处理
  4. 星爷001正式开始写blog啦
  5. PaddlePaddle中内置数据集分析
  6. fastica java_发一篇CCF-C论文有多难?
  7. opencv有基于c语言的教程吗_VS2019配置opencv详细图文教程和测试代码的实现
  8. 多元线性回归数据集_TensorFlow学习Program1——13.实现一元、多元线性回归(基于房价数据集)...
  9. ELJSTLMVC模式
  10. Goland使用技巧