itsource

케이스 스테이트먼트가 연속적으로 필요한 이유는 무엇입니까?

mycopycode 2022. 9. 29. 00:17
반응형

케이스 스테이트먼트가 연속적으로 필요한 이유는 무엇입니까?

컴파일러는 스위치의 각 코드 블록 뒤에 break 스테이트먼트를 자동으로 넣지 않는 이유는 무엇입니까?역사적 이유 때문인가요?코드 블록을 여러 개 실행하는 타이밍은 언제입니까?

같은 코드 블록에 복수의 케이스가 관련지어져 있는 것이 도움이 되는 경우가 있습니다.

case 'A':
case 'B':
case 'C':
    doSomething();
    break;

case 'D':
case 'E':
    doSomethingElse();
    break;

예를 들어 보겠습니다.

제 경험으로는 보통 한 케이스에 대해 여러 개의 코드 블록을 실행하는 것은 좋지 않은 스타일입니다만, 상황에 따라서는 사용할 수 있는 경우도 있습니다.

이유는 역사적으로case으로는 '의미하다'를 하는 것이었습니다.label타겟 포인트라고도 합니다.goto와 그 는 codecall..

에 가까운 되고 있습니다.break거의 모든 케이스의 마지막에 나타나는 기본 동작입니다.

Java는 C에서 온 구문이며, 이것은 C에서 온 구문입니다.

여러 개의 케이스 스테이트먼트에 하나의 실행 경로만 할당하는 경우가 있습니다.한 달 중 며칠을 알 수 있는 샘플은 다음과 같습니다.

class SwitchDemo2 {
    public static void main(String[] args) {

        int month = 2;
        int year = 2000;
        int numDays = 0;

        switch (month) {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                numDays = 31;
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                numDays = 30;
                break;
            case 2:
                if ( ((year % 4 == 0) && !(year % 100 == 0))
                     || (year % 400 == 0) )
                    numDays = 29;
                else
                    numDays = 28;
                break;
            default:
                System.out.println("Invalid month.");
                break;
        }
        System.out.println("Number of Days = " + numDays);
    }
}

츠미야로서, 수 있다.break 「」를 합니다.fallthrough키워드를 지정합니다.내가 쓰고 읽은 대부분의 코드는 모든 경우 이후에 중단이 있다.

케이스 폴스루로 여러 가지 재미있는 일을 할 수 있습니다.

예를 들어, 모든 경우에 대해 특정 작업을 수행하지만 특정 경우에는 해당 작업과 다른 작업을 수행한다고 가정합니다.fall-through와 함께 switch 문을 사용하면 매우 간단합니다.

switch (someValue)
{
    case extendedActionValue:
        // do extended action here, falls through to normal action
    case normalActionValue:
    case otherNormalActionValue:
        // do normal action here
        break;
}

이 말은 .break을 사용법 statementbreak을 합니다.

컴파일러는 스위치의 각 코드 블록 뒤에 break 스테이트먼트를 자동으로 넣지 않는 이유는 무엇입니까?

같은 블록을 여러 케이스에 사용할 수 있다는 희망은 차치하고라도...

역사적 이유 때문인가요?코드 블록을 여러 개 실행하는 타이밍은 언제입니까?

한 으로, 부터의 옛 이라고 할 수.goto키워드는 지구를 돌아다녔다.물론 Duff's Device와 같은 몇 가지 놀라운 것들을 가능케 하지만, 그것이 찬성인지 반대인지는 기껏해야 논쟁의 여지가 있습니다.

break " " "cases는 스위치 문의 폴스루를 피하기 위해 사용됩니다.현재는 JEP-325를 통해 구현된 새로운 스위치라벨을 통해 이를 실현할 수 있습니다.

변경에 , 「」는breakcase 자세히 설명된 바와 할 수 . 더더자 、 can can::::: 。

public class SwitchExpressionsNoFallThrough {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int value = scanner.nextInt();
        /*
         * Before JEP-325
         */
        switch (value) {
            case 1:
                System.out.println("one");
            case 2:
                System.out.println("two");
            default:
                System.out.println("many");
        }

        /*
         * After JEP-325
         */
        switch (value) {
            case 1 ->System.out.println("one");
            case 2 ->System.out.println("two");
            default ->System.out.println("many");
        }
    }
}

의 코드를 JDK-12에서 실행하면 비교 출력은 다음과 같습니다.

//input
1
// output from the implementation before JEP-325
one
two
many
// output from the implementation after JEP-325
one

그리고.

//input
2
// output from the implementation before JEP-325
two
many
// output from the implementation after JEP-325
two

그리고 물론 변하지 않은 것은

// input
3
many // default case match
many // branches to 'default' as well

따라서 동일한 작업을 수행하기 위해 여러 케이스가 필요한 경우 코드를 반복할 필요가 없습니다.

case THIS:
case THAT:
{
    code;
    break;
}

또는 다음과 같은 작업을 수행할 수 있습니다.

case THIS:
{
   do this;
}
case THAT:
{
   do that;
}

캐스케이드 방식으로.

버그/혼란하기 쉬운 것 같습니다.

역사적 기록에 따르면 토니 호어는 1960년대 "구조화된 프로그래밍" 혁명 중에 사례 진술을 발명했다.Tony의.이러한 라벨은 Tony의 가 나지 않습니다.break 조건breakBCPL/B/C를 사용하다Dennis Ritchie는 ACM HOPL-II이다.

예를 들어 BCPL switchon 스테이트먼트에서 탈출하는 엔드 케이스는 1960년대에 배운 언어에는 없었기 때문에 B 스위치스테이트먼트와 C 스위치스테이트먼트에서 탈출하기 위한 break 키워드의 오버로드가 의식적인 변화가 아닌 분산적인 진화에 기인하고 있습니다.

BCPL에 수 , 는 BCPL이 그 .break만, Ritchie와 세부 할 수 :-)BCPL은 Ritchie Thompson Unix입니다. Unix 。

Java는 Duff's Device로 알려진 기술을 포함하는 C에서 파생되었습니다.이 최적화란 한 케이스에서 다른 케이스로 제어가 실패한다는 사실에 의존합니다.break; , 깨기 를 낳았을 이다.C가 표준화 되었을 때, 그러한 코드가 「야생」에 많이 존재해, 그러한 구조를 깨기 위해서 언어를 변경하는 것은 역효과를 낳았을 것이다.

이전에도 말했지만 폴스루를 허용하기 위한 것으로 실수가 아니라 특징입니다. 경우break, 은 귀찮다, 문장은 귀찮다, 문장은 귀찮다, 문장은 없앨 수 .return대신 스테이트먼트를 입력합니다.한 것이 좋기 입니다.그 이유는 (가독성과 유지보수를 위해) 가능한 한 방법이 작아야 하기 때문입니다.switch스테이트먼트는 이미 메서드에 충분한 크기이기 때문에 적절한 메서드는 다른 것을 포함할 수 없습니다.하다

public class SwitchTester{
    private static final Log log = LogFactory.getLog(SwitchTester.class);
    public static void main(String[] args){
        log.info(monthsOfTheSeason(Season.WINTER));
        log.info(monthsOfTheSeason(Season.SPRING));
        log.info(monthsOfTheSeason(Season.SUMMER));
        log.info(monthsOfTheSeason(Season.AUTUMN));
    }

    enum Season{WINTER, SPRING, SUMMER, AUTUMN};

    static String monthsOfTheSeason(Season season){
        switch(season){
            case WINTER:
                return "Dec, Jan, Feb";
            case SPRING:
                return "Mar, Apr, May";
            case SUMMER:
                return "Jun, Jul, Aug";
            case AUTUMN:
                return "Sep, Oct, Nov";
            default:
                //actually a NullPointerException will be thrown before reaching this
                throw new IllegalArgumentException("Season must not be null");
        }        
    }
}   

실행 시 다음과 같이 출력됩니다.

12:37:25.760 [main] INFO lang.SwitchTester - Dec, Jan, Feb
12:37:25.762 [main] INFO lang.SwitchTester - Mar, Apr, May
12:37:25.762 [main] INFO lang.SwitchTester - Jun, Jul, Aug
12:37:25.762 [main] INFO lang.SwitchTester - Sep, Oct, Nov

역시나

오래된 질문이지만 사실 오늘 브레이크 스테이트먼트가 없는 케이스를 사용하게 되었습니다.여러 기능을 순차적으로 결합해야 할 경우 브레이크를 사용하지 않는 것이 매우 유용합니다.

예를 들어 http 응답 코드를 사용하여 시간 토큰으로 사용자를 인증합니다.

401 - token is olday -> 토큰은 olday -> 토큰입니다.
response 200 - OK -> in. server response code 200 - token is OK -> server server server 。

다음 문장의 경우:

case 404:
case 500:
        {
            Log.v("Server responses","Unable to respond due to server error");
            break;
        }
        case 401:
        {
             //regenerate token
        }
        case 200:
        {
            // log in user
            break;
        }

토큰이 재생성되면 런타임은 케이스 200에 들어가기 때문에 이를 사용하면 401 응답에 대해 사용자 로그인 함수를 호출할 필요가 없습니다.

되지 않은 경우 케이스를 하여 "스위치/케이스"를 사용하여 "스위치/케이스"와 같은 할 수 .1 <= a <= 32.1의 2의 스테이트먼트에서 으로써, 브레이크 를 취득할 수 있습니다.

switch(a) {
  case 1: //I'm between 1 and 3
  case 2: //I'm between 1 and 3
  case 3: //I'm between 1 and 3
          break;
}

예를 들어, 같은 코드를 여러 블록에 쓰는 것을 피하기 위해 첫 번째 블록을 통과하는 경우가 있지만 mroe 제어를 위해 코드를 분할할 수 있기 때문입니다.다른 많은 이유들도 있다.

다른 종류의 숫자, 월, 수를 쉽게 분리할 수 있습니다.
는 이게 더 요.

public static void spanishNumbers(String span){

    span = span.toLowerCase().replace(" ", "");
    switch (span){
     case "1":    
     case "jan":  System.out.println("uno"); break;    
     case "2":      
     case "feb":  System.out.println("dos"); break;    
     case "3":     
     case "mar":  System.out.println("tres"); break;   
     case "4":   
     case "apr":  System.out.println("cuatro"); break;
     case "5":    
     case "may":  System.out.println("cinco"); break;
     case "6":     
     case "jun":  System.out.println("seis"); break;
     case "7":    
     case "jul":  System.out.println("seite"); break;
     case "8":    
     case "aug":  System.out.println("ocho"); break;
     case "9":   
     case "sep":  System.out.println("nueve"); break;
     case "10":    
     case "oct": System.out.println("diez"); break;
     }
 }

는 지금 는는지 of of 가 필요한 프로젝트를 진행하고 .break그렇지 않으면 코드가 작동하지 않습니다.만 참아 주십시오.왜 가 필요한지 예를 들어 .왜 필요한지에 대한 좋은 예를 들어보겠습니다.break를 참조해 주세요.

사용자가 숫자를 입력할 때까지 기다리는 상태, 두 번째는 계산하기 위한 상태, 세 번째는 합계를 인쇄하는 상태 등 세 가지가 있다고 가정합니다.

이 경우 다음과 같이 처리됩니다.

  1. State1 - 사용자가 번호를 입력할 때까지 기다립니다.
  2. 상태2 - 합계 인쇄
  3. state3 - 합계를 계산합니다.

상태를 보면 state1에서 시작하여 state3에서 state2로 마지막 순서로 진행해야 합니다.그렇지 않으면 합계를 계산하지 않고 사용자 입력만 출력합니다.다시 한 번 명확히 하기 위해 사용자가 값을 입력하기를 기다렸다가 합계를 계산하여 인쇄합니다.

다음은 코드 예시입니다.

while(1){
    switch(state){
      case state1:
        // Wait for user input code
        state = state3; // Jump to state3
        break;
      case state2:
        //Print the sum code
        state = state3; // Jump to state3;
      case state3:
        // Calculate the sum code
        state = wait; // Jump to state1
        break;
    }
}

if if if if if if if if ifbreakstate1, state2, state3 순으로 실행됩니다.단, 을 사용하여break이 시나리오는 회피하고 state1로 시작하여 state3으로 시작하여 state2로 시작하는 올바른 순서로 순서를 지정할 수 있습니다.

정확합니다. 현명한 배치를 통해 블록을 계단식으로 실행할 수 있기 때문입니다.

언급URL : https://stackoverflow.com/questions/2710300/why-do-we-need-break-after-case-statements

반응형