当你使用Ada案例陈述时,每个案例都会自动中断.在C(或其他语言)中,不会自动执行此中断,并且执行真正的中断后的所有情况.是否也可以在Ada中使用此行为或解决方法?
Sim*_*ght 10
在Ada中永远不会有这样的行为!
唯一合理的工作方法是获取重复的代码段,将其放入(本地)过程,并在需要时调用它.
Ada的案例陈述是这样的原因是C风格让人很容易忘记break(/* FALLTHROUGH */为故意省略添加注释并不能使代码更容易阅读 - 是一个没有注释的遗漏错误吗?周围代码多少你需要阅读以确定吗?)
在MISRA C(例如这里)第60页底部附近的规则15.2中说
无条件break语句应终止每个非空switch语句.
而Ada,打算用于类似的市场,也采取了相同的立场.
大多数情况下,只需要一个动作的多种替代方案:
case K is
when 1 | 5 | 10 .. 20 =>
Action_1;
when 3 =>
Action_2;
...
end case;
Run Code Online (Sandbox Code Playgroud)
当然可以.但这是一种很少需要的行为,没有特定的语法提供它,所以你只需要使用低级原语自己滚动它.
一种方法是使用标签和gotos,案例决策逻辑与声明逻辑完全分开,如此处所示.
with Ada.Text_IO; use Ada.Text_IO;
procedure c_case_example is
c_case : natural range 1 .. 10 := 1;
begin
case c_case is
when 1 => goto case_1;
when 3 .. 5 => goto case_3;
when 6|8 => goto case_6;
when others => goto case_others;
end case;
<<case_1>> put_line("Case 1");
<<case_3>> put_line("Case 3,4,5");
goto break;
<<case_6>> put_line("Case 6,8");
<<case_others>> put_line("all other cases");
<<break>> null;
put_line("Done");
end c_case_example;
Run Code Online (Sandbox Code Playgroud)
是的,这很难看.如果你想在Ada中编写C语言,那将会很难看.