Ada案例陈述在C中表现得像?

Rai*_*low 5 case ada break

当你使用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)


Bri*_*ond 7

当然可以.但这是一种很少需要的行为,没有特定的语法提供它,所以你只需要使用低级原语自己滚动它.

一种方法是使用标签和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语言,那将会很难看.