2016-12-10 13 views
3

Ada case文を使用すると、それぞれの場合に自動的に改行が行われます。 C(または他の言語)では、このブレークは自動的には実行されず、真のもの以降のすべてのケースが実行されます。 Adaや回避策でこの動作をすることも可能ですか?Ada Case StatementはCのように動作しますか?

+6

「や他の言語を」... Cからの「インスピレーション」を描くかもしれないいくつかの言語が、私が学んだ言語と使用中、Cの転倒は非常に奇妙な男です。 Adaは、休憩を必要としないという点で、伝統(優れた実践だけでなく)に従っています。 –

答えて

6

もちろん可能です。しかし、それはあまり必要とされない動作であり、それを提供する特定の構文がないので、低レベルのプリミティブを使用して自分自身をロールバックする必要があります。

一つのアプローチはい、それは醜いだ

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; 

..きれいとしてここに文のロジックから分離した場合の判定ロジックと、ラベルとのgotoを使用することです。 AdaでCをプログラムしたいのなら、それは醜いでしょう。

10

Adaにはこのような動作はありません。

妥当な唯一の解決策は、コードの繰り返しセクションを(ローカル)プロシージャに配置し、必要な場所で呼び出すことです。

エイダのcase文は次のようである理由は、Cスタイルが本当に読みやすいコードを作成していない故意の不作為のためbreak(追加/* FALLTHROUGH */コメントを忘れるには余りにも簡単にすべてを作ることである - アンコメント抜けAであります間違っていますか?確かめるには、周囲のコードをどれくらい読む必要がありますか?)。 (例えばhere、)MISRA C 60ページの下の方のルール15.2で

は無条件break文は、すべての非空のスイッチ節を終了するものと述べています。

と類似の市場を対象としたAdaは、同じ地位を占めています。

ほとんどの時間、1つのアクションのために複数の選択肢がすべてのことが必要なのさ:

case K is 
    when 1 | 5 | 10 .. 20 => 
     Action_1; 
    when 3 => 
     Action_2; 
    ... 
end case;