什么时候可以在开关循环中省略“中断”?

时间:2017-09-13 16:22:17

标签: c++

我刚刚在learncpp, chaper 7.8解决了第一次练习。我测试了他们的开关循环版本并且它可以工作,但我不知道它没有equalTo(),在这种情况下这样的代码是否会导致不良行为?我何时可以遗漏break

这是我的版本(也可以正常使用):

break

5 个答案:

答案 0 :(得分:8)

如果没有#include <deque> struct Node { int level; const Node* const l; const Node* const r; Node(int level, const Node* l, const Node* r): level(level), l(l), r(r) { } int check() const { if(l) return l->check() + 1 + r->check(); else return 1; } }; using Pool = std::deque<Node>; Node* make(int d, Pool& pool) { Node* l = d > 0 ? make(d - 1, pool) : nullptr; Node* r = d > 0 ? make(d - 1, pool) : nullptr; return &pool.emplace_back(d, l, r); } ,执行流程将继续执行下一个案例 - 除非您以其他方式跳转(例如break,在您的情况下)。这称为 fall-through

这是否是一个错误取决于程序。如果(例如)您希望多个return具有相同的操作,则会很有用:

case

答案 1 :(得分:4)

请注意,使用break时,C ++不会坚持,但switch个案例通常依赖于它们,以避免使用贯穿始终特征

如果程序控制从未到达,则可以删除对您的程序没有影响的breakbreak语句之后的return语句都不可访问,因此您可以安全地删除它们。

您也不需要空default标签。

答案 2 :(得分:3)

由于您不熟悉C ++,请考虑:

  • 只要您的代码到达return语句,您当前的函数/方法将结束并返回指定的值,而不执行任何更多的代码行。所以永远不会达到你的break陈述。

  • 当达到break时,当前switchwhilefor将结束。流程将继续超出其范围{...}

  • 如果您未在break中使用switch case,则流程会继续(即使是下一个案例)。

答案 3 :(得分:2)

了解switch在幕后所做的事情可能对您有所帮助。

基本上是这样的:

enum command {
    add, subtract, multiply, divide, error
};

command foo(char op)
{
    switch (op)
    {
    case '+': {
        return add;
            break;}
    case '-': {
        return subtract;
        break;}
    case '*': {
        return multiply;
        break;}
    case '/': {
        return divide;
        break;}
    default: 
      break;
    }
    return error;
}

在逻辑上与此相同:

command foo_that_will_give_people_seizures(char op)
{
    if (op == '+') goto plus_;
    if (op == '-') goto minus_;
    if (op == '*') goto mpy_;
    if (op == '/') goto div_;
    goto break_;

    plus_:
    return add;
    goto break_;   // notice how this statement cannot be reached.

    minus_:
    return subtract;

    mpy_:
    return multiply;

    div_:
    return divide;

    break_:
        ;
    return error;
}

并且第一个函数中任何一个案例中出现的语句break;等同于第二个函数中的goto break_

PS。你不会赢得任何写这样代码的朋友。人们喜欢假装goto在c ++中是一件坏事; - )

答案 4 :(得分:1)

你应该知道,在default:(如果默认是最后一种情况),代码流基本到达终点并且不需要获取break时,应该忽略中断

break的目的是在实际情况为真时阻止代码继续下一个案例。但是,return返回案例中的给定语句并中断switch。如果您考虑返回switch个案例,那么您可以使用break而不是return foobar;,它可以通过返回您想要返回的内容而中断。