2016-12-10 4 views
3

Ada case 문을 사용하면 각 사례마다 자동으로 휴식이 있습니다. C (또는 다른 언어)에서는이 중단이 자동으로 수행되지 않고 실제 중단 이후의 모든 사례가 실행됩니다. Ada 또는 해결 방법에서이 동작을 수행 할 수도 있습니까?Ada Case 문은 C에서와 유사하게 동작합니까?

+6

"또는 다른 언어"... C에서 "영감"을 그려 어쩌면 일부 언어 만 언어로 내가 배운 및 사용 , C의 fallthrough는 아주 이상한 남자입니다. 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; 

예는 추한 ... 깨끗하게으로 여기에 문 로직에서 분리 된 경우 결정 로직, 라벨 및 gotos를 사용하는 것입니다. Ada에서 C 프로그램을 작성하려면 추한 것입니다.

10

Ada에서 이와 같은 행동이 발생하지 않습니다.

유일한 합리적인 해결 방법은 반복되는 코드 섹션을 가져 와서 (로컬) 프로 시저에 넣고 필요할 때 호출하는 것입니다.

에이다의 경우 문은 다음과 인 이유는 C 스타일이 정말 쉽게 읽을 수있는 코드를하지 않는 고의적 인 누락에 대한 break (추가 /* FALLTHROUGH */ 의견을 잊지 너무 쉽게 모든 만드는 것입니다 - 주석 누락 A는 실수로 주변의 코드를 읽으려면 어느 정도 읽어야합니까?). (예를 들어 here) MISRA C 60 페이지의 아래쪽에 규칙 15.2에서

은 무조건 휴식 문이 비어 있지 않은 모든 스위치 절을 종료해야한다 말한다.

이와 유사한 시장을 대상으로 한 Ada는 동일한 지위를 차지했습니다.

는 하나 개의 동작에 대한 여러 대안이 모두 필요할

대부분의 배 :

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