专栏首页C++核心准则原文翻译C++核心准则ES.77:循环中尽量少用break和continue

C++核心准则ES.77:循环中尽量少用break和continue

ES.77: Minimize the use of break and continue in loops

ES.77:循环中尽量少用break和continue

Reason(原因)

In a non-trivial loop body, it is easy to overlook a break or a continue.

A break in a loop has a dramatically different meaning than a break in a switch-statement (and you can have switch-statement in a loop and a loop in a switch-case).

在不规整的循环体中,很容易忽略掉break和continue。循环中的break和switch语句中的break存在显著的不同(同时你还可以将在循环体内放入switch语句或者在switch语句中放入循环。)

Example(示例)

switch(x) {
case 1 :
    while (/* some condition */) {
        //...
    break;
    } //Oops! break switch or break while intended?
case 2 :
    //...
    break;
}
Alternative(可选项)

Often, a loop that requires a break is a good candidate for a function (algorithm), in which case the break becomes a return.

需要break的循环通常很适合做成函数(算法),这是break可以变成return。

//Original code: break inside loop
void use1()
{
    std::vector<T> vec = {/* initialized with some values */};
    T value;
    for (const T item : vec) {
        if (/* some condition*/) {
            value = item;
            break;
        }
    }
    /* then do something with value */
}

//BETTER: create a function and return inside loop
T search(const std::vector<T> &vec)
{
    for (const T &item : vec) {
        if (/* some condition*/) return item;
    }
    return T(); //default value
}

void use2()
{
    std::vector<T> vec = {/* initialized with some values */};
    T value = search(vec);
    /* then do something with value */
}

Often, a loop that uses continue can equivalently and as clearly be expressed by an if-statement.

通常,使用continue的循环可以等价地,清晰地表示为if语句。

for (int item : vec) { //BAD
    if (item%2 == 0) continue;
    if (item == 5) continue;
    if (item > 10) continue;
    /* do something with item */
}

for (int item : vec) { //GOOD
    if (item%2 != 0 && item != 5 && item <= 10) {
        /* do something with item */
    }
}
Note(注意)

If you really need to break out a loop, a break is typically better than alternatives such as modifying the loop variable or a goto:

如果你确实需要终端一个循环,break通常会优于修改循环变量或goto语句。

Enforcement(实施建议)

原文链接

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#es77-minimize-the-use-of-break-and-continue-in-loops

本文分享自微信公众号 - 面向对象思考(OOThinkingDalian),作者:面向对象思考

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-06-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++核心准则ES.86:避免在基本for循环的循环体中修改循环控制变量​

    ES.86: Avoid modifying loop control variables inside the body of raw for-loops

    面向对象思考
  • C++核心准则ES.11:使用auto避免多余的类型名重复

    In each case, we save writing a longish, hard-to-remember type that the compiler...

    面向对象思考
  • C++核心准则ES.74:尽量在循环变量初始化表达式中定义循环变量​

    Limit the loop variable visibility to the scope of the loop. Avoid using the loo...

    面向对象思考
  • 笔记:NEC QTP 第一个实例

    JavaWindow("User Login").JavaObject("MessageLabel(st)").Check CheckPoint("Messag...

    超级大猪
  • Flask-9 博客帖子分页功能

    修改Flask_Blog\flaskblog\routes.py,修改home方法使用分页查询方式,每页显示两条数据:

    亚乐记
  • 在线免费的前端黑工具 XSS'OR

    地址:xssor.io 这是一个在线免费的前端黑工具,目前主要包含 3 大模块: 1. Encode/Decode 加解密模块,包含:前端黑相关的加解密,代码压...

    Seebug漏洞平台
  • 约数之和

    $A = \prod_{i = 1} ^ {n} p_i ^ {a_i} = p_1 ^ {a_1} p_2 ^ {a_2} p_3 ^ {a_3} … ...

    xiaohejun
  • BZOJ3667: Rabin-Miller算法

    Description Input 第一行:CAS,代表数据组数(不大于350),以下CAS行,每行一个数字,保证在64位长整形范围内,并且没有负数。你需要对...

    attack
  • Day6下午题解1

    预计分数:100+?+30=130+? 实际分数:100+25+30=155 T1 https://www.luogu.org/problem/show?pid...

    attack
  • 网鼎杯青龙组2020部分题解

    简单pop链构造:op=2的时候,去让read()中的file_get_contents执行。

    KevinBruce

扫码关注云+社区

领取腾讯云代金券