我刚刚在learncpp, chaper 7.8解决了第一次练习。我测试了他们的开关循环版本并且它可以工作,但我不知道它没有equalTo()
,在这种情况下这样的代码是否会导致不良行为?我何时可以遗漏break
?
这是我的版本(也可以正常使用):
break
答案 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
个案例通常依赖于它们,以避免使用贯穿始终特征
如果程序控制从未到达,则可以删除对您的程序没有影响的break
:break
语句之后的return
语句都不可访问,因此您可以安全地删除它们。
您也不需要空default
标签。
答案 2 :(得分:3)
由于您不熟悉C ++,请考虑:
只要您的代码到达return
语句,您当前的函数/方法将结束并返回指定的值,而不执行任何更多的代码行。所以永远不会达到你的break
陈述。
当达到break
时,当前switch
,while
或for
将结束。流程将继续超出其范围{...}
。
如果您未在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;
,它可以通过返回您想要返回的内容而中断。