케이스 스테이트먼트가 연속적으로 필요한 이유는 무엇입니까?
컴파일러는 스위치의 각 코드 블록 뒤에 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
" " "case
s는 스위치 문의 폴스루를 피하기 위해 사용됩니다.현재는 JEP-325를 통해 구현된 새로운 스위치라벨을 통해 이를 실현할 수 있습니다.
변경에 , 「」는break
case
자세히 설명된 바와 할 수 . 더더자 、 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
조건break
BCPL/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 <= 3
2.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
를 참조해 주세요.
사용자가 숫자를 입력할 때까지 기다리는 상태, 두 번째는 계산하기 위한 상태, 세 번째는 합계를 인쇄하는 상태 등 세 가지가 있다고 가정합니다.
이 경우 다음과 같이 처리됩니다.
- State1 - 사용자가 번호를 입력할 때까지 기다립니다.
- 상태2 - 합계 인쇄
- 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 ifbreak
state1, state2, state3 순으로 실행됩니다.단, 을 사용하여break
이 시나리오는 회피하고 state1로 시작하여 state3으로 시작하여 state2로 시작하는 올바른 순서로 순서를 지정할 수 있습니다.
정확합니다. 현명한 배치를 통해 블록을 계단식으로 실행할 수 있기 때문입니다.
언급URL : https://stackoverflow.com/questions/2710300/why-do-we-need-break-after-case-statements
'itsource' 카테고리의 다른 글
즉시 인라인 SQL 테이블 생성(왼쪽 조인 제외용) (0) | 2022.09.29 |
---|---|
bootstrap-vue 모달 본문과 바닥글에 콘텐츠를 프로그래밍 방식으로 주입하려면 어떻게 해야 합니까? (0) | 2022.09.29 |
SELECT 속도를 높이는 방법..MySQL의 LIKE 쿼리가 여러 열에 있습니까? (0) | 2022.09.29 |
두 변수의 값을 교환하기 위한 PHP 함수가 있습니까? (0) | 2022.09.28 |
MYSQL - 경고: #1681 정수 표시 너비는 권장되지 않습니다. (0) | 2022.09.28 |