2017-10-06 1 views
1

스위치 구문 : 나는 그들이 무엇을하는지 압니다. 일반적으로 컨벤션마다 열거 형의 값에 따라 다른 작업을 수행하려고 할 때 여러 번 사용합니다. 그러나 지금은 단지 나를 때렸습니다 : 왜 우리가 사용하고 있습니까? ?원래 목적은 무엇입니까? 나는이 의미 :`switch` 문은 무엇입니까?

switch(myVar) { 
    case Foo: 
     doSomething(); 
     break; 
    case Bar: 
     doSomethingElse(); 
     break; 
    default: 
     justAnotherThing(); 
     break; 
} 

는 다음과 같이 동일한 동작을 가지고 :

if(myVar == Foo) { 
    doSomething() 
}else if(myVar == Bar) { 
    doSomethingElse(); 
}else { 
    justAnotherThing(); 
} 

플러스 if의 당신이 할 수 있습니다 불평등의 비교는 (>, <, !=) 당신이 그것을 필요로하는 경우에. 더 유용한 스위치를 찾을 수있는 유일한 경우는 내부에 break 문을 사용하지 않는 경우입니다. 그러나 너무 자주 발생하지는 않습니다. 코드 품질이 매우 낮습니다.

switch을 (를) 통해 if을 (를) 사용하면 얻을 수있는 이점을 찾을 수 없습니다. 왜 그렇습니까?

+2

이제 10 개의 대안 또는 20 개가있는 'if-else if' 체인을 실행하면 그다지 읽을 수 없습니다. 또한 컴파일러는 "일치"를 찾을 때까지 각 조건을 평가할 필요없이 단순한 점프 테이블로 '스위치'를 최적화 할 수 있습니다. 그리고 C와 유사한 언어 (기본 언어로 사용하는 것 같습니다)의 경우 * 중단이 없다면 아래의 다음 사례로 넘어갑니다. 그것은 if-else if 체인에서하는 것이 훨씬 더 어렵습니다. –

+0

읽기 능력에 관해서는 거의 동일하다고 생각합니다. 일관된 식별자를 유지하고'switch'를 사용할 경우'if-else if'를 사용하면'else else if (myVar =='항상 같은 공간을 사용하여 모든 가능한 값을 정렬하고 읽기 쉽도록합니다.) – olivarra1

+0

그리고 제 질문으로는 'break'를 제거하여 fall-through 동작을 언급했지만 읽기 쉽도록 끔찍합니다. 다음 경우로 넘어갈 수도 있고 그렇지 않을 수도있는 경우와 경우의 순서를 변경하는 것은 동작에 영향을 미칩니다. 나는이 "트릭"을 사용하여 스위치에 대한 비교를 수행하고 그렇지 않으면 피하기 위해 노력합니다. – olivarra1

답변

4

일부 언어는 switch 문에서도 부등식 비교를 허용합니다. Visual Basic의 :

Select Case x 
    Case < 5 
    // ... 
    Case 7 
    // ... 
    Case 10 To 15 
    // ... 
    Case Else 
    // ... 
End Select 

기본적으로, 예, switch은 종종 switch 비교 값의 수에 대해 하나 개 값을 비교하는 차이와 더불어, if/else if 사다리과 같이 쓸 수있다 if/else if 무엇이든 할 수 모든 단일 지점에서. 그러나 모든 언어에서 그런 경우조차도 아닙니다.

switch -Regex ($x) { 
    '^\d+$' {'Number'} 
} 

또는 일반적으로

switch ($x) { 
    { $_ is [int] -or $_ is [double] } {'Number'} 
    { $_ is [string] } {'Text'} 
} 

은, 그러나, switch이 하나를 비교하는 일반적인 경우를 쉽게 읽을 수 있습니다 : PowerShell을에 switch 당신이 보통에 대한 if를 사용해야 할 일을 충분히 할 수있다 값을 유한 옵션 집합과 비교합니다. 또한 컴파일러는 컴파일러가 이진 검색을 사용하여 선형 검색 대신 올바른 경우를 결정하거나 점프 테이블이나 산술을 사용하는 경우와 같이 if/ else if에서 분석하기가 더 어려운 특정 최적화 작업을 수행 할 수 있습니다. 예 : 다음 스위치

switch (x) { 
    case 0: 
    // Do something with 0 
    break; 
    case 1: 
    // Do something with 1 
    break; 
    case 2: 
    // Do something with 2 
    break; 
    ... 
} 

은 전체 무엇을 결정하기 위해 분석 훨씬 적은 거기 때문에 단순하고 switch의 한계는 최적화 컴파일러이 경우에 도움이됩니다

Action[] actions = { 
() => { /* Do something with 0 */ }, 
() => { /* Do something with 1 */ }, 
() => { /* Do something with 2 */ }, 
    ... 
}; 
if (x >=0 && x <= n) { 
    actions[x](); 
} 

에 해당하는로 컴파일 될 수있다 구조가하려고합니다.

Duff's device과 같은 다른 기능 (예 : 모호한 값) 또는 다른 사례 (또는 C#에서 허용하는 임의의 다른 경우 goto)로 전달할 수있는 기능이 있습니다.

goto을 사용하는 대신 if 문과 루프가있는 이유를 묻는 것이 좋습니다. 그렇습니다. 구조화 된 프로그래밍 구조는보다 일반적인 구조와 비교하여 표현할 수있는 수준에서 엄격하게 열세입니다.그러나 그들은 더 가독성이 있으며, 의도를 명확하게하고, 유지 관리가 더 쉽고 안전합니다.

2

switch은 매우 낮은 수준의 문장으로, case 문장의 코드는 메모리에있는 연속적인 명령어 블록으로 컴파일된다는 점에서 간단히 조건부로 (물론 해당 언어의 언어에 따라 달라집니다.) 고급 언어는 후드에서 아주 다르게 동작 할 수 있습니다.) 또한 출발점 주소가 결정되면 이탈 명령이 실행되지 않는 한 모든 후속 명령이 실행됩니다.

처음에는 지시 블록 위로 뛰어 넘기위한 매우 자연스러운 방법이었습니다. 그것은 는, 실제로 예를 들어, 어떤 경우에는 오히려 읽을 수 때문에 많은 언어는 친숙으로 인해 다수의 가능성뿐만 아니라, 가능성이 많은 switch 성명을 채택했다 :

특히,이 표현하는 매우 간결한 방법이다
switch (someComplicatedCalculation($foo, $bar)) { 
    case CONSTANT_A: 
     ... 
    case CONSTANT_B: 
     ... 
    ... 
} 

당신은 또한 아마도 쓰루 쓰루 (through-through) 행동에 의존 할 것입니다.

물론 다른 언어는 switch을 채택한 적이 없습니다. Python을 사용하고 대신 if..elif..else을 사용해야합니다. 결국 어느 언어 구조를 사용해도 비슷한 코드를 작성할 수 있습니다.

관련 문제