Ada case 문을 사용하면 각 사례마다 자동으로 휴식이 있습니다. C (또는 다른 언어)에서는이 중단이 자동으로 수행되지 않고 실제 중단 이후의 모든 사례가 실행됩니다. Ada 또는 해결 방법에서이 동작을 수행 할 수도 있습니까?Ada Case 문은 C에서와 유사하게 동작합니까?
3
A
답변
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;
"또는 다른 언어"... C에서 "영감"을 그려 어쩌면 일부 언어 만 언어로 내가 배운 및 사용 , C의 fallthrough는 아주 이상한 남자입니다. Ada는 휴식을 필요로하지 않기 때문에 (좋은 습관뿐만 아니라) 전통을 따르고 있습니다. –