2014-09-16 4 views
4

다음 코드는 컴파일 :switch 문 안에 임의의 레이블을 허용하는 이유는 무엇입니까?

int a = 0; 

switch (a) 
{ 
    case 1: 
     return; 
    defau1t:  // note the typo 
     return; 
} 

defau1t 때문에이 goto 레이블로 해석됩니다. 다음과 같은 경우에 그러나

는 :

오류 CS1525 : 예기치 않은 기호 defau1t', expecting} ', case', or 기본'

switch (a) 
{ 
    defau1t: 
     return; 
} 

컴파일러 올바르게 실수를 식별 그게 뭐야? switch 문에서 임의의 레이블을 허용하는 이유는 (겉으로보기에) 일관성없는 동작으로 연결되는 경우 무엇입니까?

사이드 노트 : C++ 및 Java와 유사한 조각으로 동일한 문제가 발생할 수 있습니다.

+1

레이블이 허용되지 않는 곳이 있습니까? 누군가가 특별히 스위치를 허용하기로 결정한 것은 아닙니다. – mellamokb

+0

"* switch_only_statement *"를 일반 "* statement"이외에 만들지 않고'switch' 안에 * 레이블을 허용하지 않는 것이 제 생각으로 –

+0

레이블을 가질 수 없다면'goto'는 무의미합니다. , 그렇지? – hvd

답변

9

나는 이것이 잘못된 길을보고 있다고 생각합니다. 그것을 허용하는 특별한 예외가 만들어진 것이 아니라, 그것을 허용하는 특별한 예외가 없다는 것입니다.

블록은 블록이 case 또는 default 레이블로 시작해야하지만 그 외의 유효한 코드는 블록의 일부일 수 있습니다.

다른 레이블 포함.

이것을 허용하지 않으면 언어를 이해하기가 더 복잡해지고 컴파일러를 작성하기가 어려워지고 이점은 미미하며 그 이점은 미미합니다.

+0

내 마음을 정확하게 읽은 것 같습니다. 나는'switch' 블록을 특수한 것으로 생각했고, 미리 정의 된 케이스 구조와 내부 케이스 블록으로 생각했습니다. 당신의 견해가이를 없애줍니다. 나는 이것이 괜찮은지 여전히 논쟁 중이다. 불일치가있다. 혼란 스러울 수 있기 때문에 fall-through가 허용되지 않으므로 코드 가독성을 위해 몇 가지 추가적인 특별한 규칙이 존재한다. 이것도 같은 경우입니다. – BartoszKP

+0

@BartoszKP 실제로 fall-through는 허용되지 않습니다. 그러나 구문에서 특별한 예외는 아닙니다. 앞의'case' 브랜치는'break; '로 끝날 필요가 없습니다 : "무한"루프 (아마도 내부의'return' 문과 함께) 나'return' 문으로 직접 끝날 수도 있고' goto' 또는'throw' 등 실제로 fall-through를 일으키지 않는 다른 것. 컴파일러는'switch'가 아닌'case'에 도달 할 수있는 방법이 있는지'case'를 볼 때 검사합니다. 유효한 유용한 코드를 거부하지 않고 일반 레이블을 확인하는 방법을 확장하는 방법을 알지 못합니다. – hvd

1

C#은 이것이 사양에 나와 있으므로이 방법으로 작동합니다. C# 사양의 섹션 8.7.2에서는 switch 문의 문법을 정의합니다. 특히 스위치 블록이 비어 있지 않으면 스위치 섹션을 포함해야하며 스위치 섹션은 스위치 레이블 (case <constant expression>: 또는 default:)로 시작해야합니다. 두 번째 예에서는 비어 있지 않은 스위치 블록이 있는데이 스위치 블록에는 유효한 스위치 섹션이 없으므로 유효한 명령문이 아닙니다.

Eric Lippert에게 약간의 채널을 허용하려면 스위치 블록 내에서 레이블이있는 명령문을 허용하지 않는 것은 잉태, 제안, 설계, 지정, 개발, 테스트, 문서화 및 배송해야하는 언어 기능입니다. 내 생각에이 기능은 아마도 과거에 잉태 된 적이 없었을 것입니다.

+0

입력 해 주셔서 감사합니다. 그러나 1) 대부분의 언어는 어떻게 만들어졌으며, 문법 때문에 "작동"합니다. 2) 모든 언어 기능을 고안, 제안, 설계, 지정, 개발, 테스트, 문서화 및 배송해야합니다. 이 두 문장은 프로그래밍 컨텍스트에서 거의 모든 것에 적용되므로 매우 도움이되지는 않습니다. – BartoszKP

+0

@BartoszKP : 당신의 질문이 도움이되지 않는 대답을한다는 사실은 애매한 질문의 함수입니다. 당신이 더 나은 대답을 원한다면 더 정확한 질문을하십시오. –

+0

"이 언어에 기능 X가없는 이유는" "기능 X가 사양에 없기 때문에"라는 유일한 대답입니다. "기능 X가 사양에 포함되지 않은 이유"에 대한 유일한 대답은 기능 X가 언어 디자인 및 구현에서 이러한 단계 중 하나를 지나치게 만들지 않았기 때문입니다. "X가이 단계를 통해 X를 만들지 않은 이유"를 묻는다면, 언어 디자인 팀에 속하지 않은 사람으로부터 얻은 모든 대답은 순수한 추측이 될 것입니다. –