왜 언어가 switch 문에서 명시적인 fall-through를 사용하지 않습니까?


17

나는 읽고 있었다 우리가 사용해야하는 이유는 무엇 breakswitch? , 그리고 일부 언어 (예 : PHP 및 JavaScript)에서 암시 적 폴스 루가 허용되는 이유에 대해 궁금해했지만 명시적인 폴 스루에 대한 지원 (AFAIK)은 없습니다.

새 키워드를 작성해야 할 필요 continue는 없습니다. 완벽하게 적절하고 저자가 사건이 발생했는지 여부에 대한 모호성 문제를 해결합니다.

현재 지원되는 형식은 다음과 같습니다.

switch (s) {
    case 1:
        ...
        break;
    case 2:
        ... //ambiguous, was break forgotten?
    case 3:
        ...
        break;
    default:
        ...
        break;
}

반면 다음과 같이 작성되는 것이 합리적입니다.

switch (s) {
    case 1:
        ...
        break;
    case 2:
        ...
        continue; //unambiguous, the author was explicit
    case 3:
        ...
        break;
    default:
        ...
        break;
}

이 질문의 목적을 위해 폴스 루가 좋은 코딩 스타일인지 아닌지의 문제를 무시할 수 있습니다.

대체를 허용하고 명시 적으로 만든 언어가 있습니까?

switch명시 적 대신 암묵적으로 넘어 질 수 있는 역사적 이유가 있습니까?


4
C #에서는을 명시 적으로 요구 goto case하므로 질문의 전제는 약간 잘못되었습니다.
pdr

1
@ pdr, 나는 이미 fall-through를 지원하는 언어가 있는지 명확하게 물었 goto case습니다 .C # 에서는 알지 못했습니다 .
zzzzBov

네, 죄송합니다. 귀하의 질문에 두 부분이 있다는 것을 놓쳤습니다. 불행히도, 그대로 말하면, 나는 여론 조사 질문에 매우 가깝기 때문에 닫으려고 투표하고 있습니다. 정답이 많이 있습니다.
pdr

C #을 사용하면 동일한 레이블 목록을 여러 레이블에 공유 할 수 있으므로 대체가 필요한 일부 상황을 제거 할 수 있습니다. 나머지 goto case는 pdr이 언급했듯이.
Brian

답변:


20

그것은 주로 역사적이며 대부분의 언어는 C가 한 일을 복사했습니다.

C가 그렇게 한 이유는 C의 작성자가 점프 명령문으로 쉽게 최적화 할 수 있도록 스위치 명령문을 의도했기 때문입니다. 이것이 C가 스위치 문을 정수 값으로 제한하는 이유이기도합니다.

점프 테이블에서 프로그램은 표현식을 기반으로 점프 할 위치를 계산합니다. 프로그램이 해당 지점으로 이동 한 다음 해당 지점에서 계속 실행됩니다. 나머지 테이블을 건너 뛰려면 테이블 끝에 점프를 포함시켜야합니다. C는 break이 구문에 직접 대응되도록 명시적인 명령문을 사용합니다 .


7
피터 반 데어 린든 (Peter van der Linden)은 자신의 저서 "전문가 C 프로그래밍 (Expert C Programming)"에서 썬이 C 컴파일러에서 일하는 동안 스위치 케이스의 ~ 97 %가 포함되어 break있고 3 % 미만 만이 실패 했다고 언급했다. . 그런 다음이를 기본 폴 스루 동작이 반 직관적이며 역순으로하는 것이 좋습니다 (명시적인 폴 스루를 나타내는 키워드 사용). 아, 그리고이 책은 C의 다른 이상한 점들도 설명하는데 정말 좋습니다. 그 중 일부는 C ++과 심지어 C #과 Java에서도 발견됩니다! 그것은 모두 B와 BCPL에 뿌리를두고 있습니다. :)
zxcdw

3
c # ( msdn.microsoft.com/en-us/library/06tc147t(v=vs.71).aspx ) 과 같이 대체 언어가 명백한 프로그래밍 언어가 있습니다 . 반면에 C #에서는 구분도 명시 적입니다.
linkerro

@zxcdw : 조금 버디가 시간을 거슬러 올라갈 수있는 방법은 없으며 case첫 번째 레이블 이외의 레이블 이 자동으로 접두사로 break표시 되어야 하지만 레이블이있는 레이블 +case(또는 다른 지정자)은 그렇지 않아야합니다. 컴파일러가 현재 배열의 의미 론적 이점을 처리하고 허용하면서 많은 코드 줄을 제거하는 것이 쉬웠을 것입니다.
supercat

7

Go는 fallthrough키워드를 사용하여 명시적인 폴 스루를 허용 합니다 (break는 암시 적이지만 명시적일 수 있음).

switch val {
case 1: // breaks
case 2:
    fallthrough
case 3:
    goto 
case 4, 5, 6: // equivalent to defining individual cases with explicit fallthough
    break // unnecessary
default:
}

효과적인 이동언어 사양 의 관련 내용은 다음과 같습니다 .

나는 당신이 사용할 수 있다고 생각하지 않습니다 goto특정 케이스로 이동합니다,하지만 당신은 케이스 내부 라벨을하고 사용할 수 있습니다 goto정상처럼.

또한 Go를 사용하면 스위치에서 이진 표현식, 문자열 또는 유형 을 대 / 소문자로 사용할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.