switch 문에서 continue 사용


88

switch문 중간 에서 다음 코드의 루프 문 으로 건너 뛰고 싶습니다 .

while (something = get_something())
{
    switch (something)
    {
    case A:
    case B:
        break;
    default:
        // get another something and try again
        continue;
    }
    // do something for a handled something
    do_something();
}

이것이 유효한 사용 방법 continue입니까? continue명령문 은 명령문에서 무시 switch됩니까? 여기서 C와 C ++의 동작이 다른가요?


귀하의 아이디어는 괜찮지 만 위의 루프는 실행되지 않습니다 do_something().
antik

5
통제가 사례 A 또는 사례 B에 도달하더라도?
Alexander Poluektov

18
나는 antik가 그것에 대해 틀렸다고 말하고 싶었습니다. A 또는 B의 경우 do_something ()이 실행됩니다. 기본적으로 보석금이 부과됩니다.
Antony Woods

3
@acron, 그 의도 된 행동이다
매트 소목

1
나는 이것이 훨씬 더 의심스럽고 혼란스러워 보이므로 goto.
phoeagon

답변:


56

괜찮습니다. continue문은 둘러싸는 루프와 관련이 있으며 코드는 다음과 같아야합니다 (이러한 점프 문을 피함).

while (something = get_something()) {
    if (something == A || something == B)
        do_something();
}

그러나 break귀하의 의견이 제안한 것처럼 루프를 종료하려면 (거짓으로 평가 될 때까지 항상 다른 무언가로 다시 시도합니다) 다른 구조가 필요합니다.

예를 들면 :

do {
    something = get_something();
} while (!(something == A || something == B));
do_something();

2
의미 론적 의미에서만 '동등'합니다. 컴파일러가 생성하는 코드는 매우 다릅니다. switch 문을 사용하면 컴파일러는 다중 비교를 피하는 점프 테이블을 생성 할 수 있으므로 각 요소를 1 씩 비교하는 것보다 훨씬 빠릅니다.
chacham15

@ chacham15, 왜 컴파일러가 두 가지 모두에 대해 동일한 코드를 생성 할 수 없습니까?
avakar

@avakar switch 문은 점프 테이블을 생성하는 반면 다른 표현은 일련의 논리적 평가입니다. 자세한 내용은 Google 점프 테이블을 참조하십시오.
chacham15

@ chacham15, 컴파일러가 두 개의 if 문 또는 스위치에 대한 일련의 논리적 평가에 대한 점프 테이블을 생성하지 못하게하는 것은 무엇입니까?
avakar

1
@avakar switch 문에서는 case가 상수 값이어야합니다. if 문이있는 경우가 아니기 때문에 동일한 최적화를 수행 할 수 없기 때문입니다 (참고 : 일반적인 경우에는 특정 요구 사항 (예 : const 값만 , 특정 논리 연산자 만) 최적화를 수행 할 수 있지만 컴파일러 의존성이 높고 YMMV).
chacham15

20

예, 괜찮습니다 if. 성명서 에서 사용하는 것과 같습니다 . 물론 a break를 사용 하여 스위치 내부에서 루프를 벗어날 수는 없습니다 .


그러나 또는 if의 동작에는 영향을 미치지 않습니다 . 똑같다는 게 무슨 뜻이야? continuebreak
Matt Joiner

@Matt 두 경우 모두 루프를 계속할 것입니다.

1
@Neil, 좋아, 혼란을 피했습니다.
Matt Joiner

1
@ KiJéy 나는 이것에 대한 참조를 찾을 수 없으며 수년 동안 C 프로그래밍에서 이것을 지원하는 컴파일러를 본 적이 없습니다 ... 도대체 어디에서 이것을 찾았습니까?
arjunyg

2
죄송 와우, 내가 PHP에서 이것을보고는 밝혀 그냥 PHP ..., 그것은 오래된 관행이라고 생각
기 Jéy

15

예, 계속은 switch 문에 의해 무시되고 테스트 할 루프의 조건으로 이동합니다. Ritchie의 C 프로그래밍 언어 참조에서 발췌 한 내용을 공유하고 싶습니다.

continue문은와 관련이 break있지만 덜 자주 사용됩니다. 이는 둘러싸 forwhile, 또는 do루프 의 다음 반복이 시작되도록합니다. 으로 while하고 do,이 수단은 테스트 부분은 즉시 실행된다; 에서 for제어는 증분 단계로 전달됩니다.

continue 문은 문이 아닌 루프에만 적용됩니다 switch. continue내부 a를 switch루프 내부는 다음 루프 반복됩니다.

C ++에 대해서는 잘 모르겠습니다.


8

구문 론적으로 정확하고 문체 적으로 괜찮습니다.

좋은 스타일을 사용하려면 모든 case:문장이 다음 중 하나로 끝나야합니다.

 break;
 continue;
 return (x);
 exit (x);
 throw (x);
 //fallthrough

또한 case (x):즉시

 case (y):
 default:

허용됨-정확히 동일한 효과를 가진 여러 케이스를 번들로 묶습니다.

다른 건처럼, 실수로 의심되는 if(a=4){...} 물론 당신이 루프 (둘러싸 필요 while, for, do...while에 대한) continue작업이다. case()혼자로 돌아 가지 않습니다 . 그러나 다음과 같은 구조입니다.

while(record = getNewRecord())
{
    switch(record.type)
    {
        case RECORD_TYPE_...;
            ...
        break;
        default: //unknown type
            continue; //skip processing this record altogether.
    }
    //...more processing...
}

...괜찮아.


2
necroposting에 대해 미안하지만,에 대한 호출 exit도 일반적으로 스위치 케이스를 끝내는 좋은 방법 이라고 덧붙일 것입니다.
Vality 2014

1
글쎄, 난 모두 가지고 갈거야 프랑켄슈타인 박사를 여기 또한 지적 default:으로 - 마지막 / 아래 항목 일 필요는 없습니다 ... 질문 점을
SlySven

1
@SlySven : 어휘 적으로, 그렇지 않습니다.하지만 마지막으로 만들지 않을 타당한 이유가 없다면 마지막으로 만드십시오. 다른 장소에서 사용하면 종종 혼란 스럽습니다.
SF.

1
@SF. 글쎄, 나는 default:사건을 마지막 대신 첫 번째 사건 으로 만드는 것이 더 합리적 인 경우를 쉽게 상상할 수 있습니다 . "다음과 같이 처리해야하는 다음과 같은 비정상적인 값을 얻지 않는 한 이렇게하십시오."
Ruslan

5

기술적으로는 유효하지만 이러한 모든 점프는 제어 흐름, 특히 continue명령문을 모호하게 만듭니다.

나는 그러한 트릭을 첫 번째가 아닌 최후의 수단으로 사용할 것입니다.

어때

while (something = get_something())
{
    switch (something)
    {
    case A:
    case B:
        do_something();
    }        
}

더 짧고 더 명확한 방식으로 작업을 수행합니다.


1
혼동을 드려 죄송합니다 Alexander, 코드는 데모 용입니다. 내 코드의 실제 구조에 대한 충분한 이유가 있습니다.
Matt Joiner

2
@Matt : 아마 훨씬 더 난독 화 된 구조를 의미 할 것입니다 ... :)
방문자

-2

이것은 메가 비트에서 늦을 수 있지만 사용할 수 있습니다 continue 2.

일부 PHP 빌드 / 구성은 다음 경고를 출력합니다.

PHP 경고 : "계속"타겟팅 스위치는 "중단"과 동일합니다. "계속 2"를 사용하려고 하셨나요?

예를 들면 :

$i = 1;

while ($i <= 10) {
    $mod = $i % 4;
    echo "\r\n out $i";
    $i++;
    switch($mod)
    {
        case 0:
            break;
        case 2:
            continue;
            break;
        default:
            continue 2;
            break;
    }
    echo " is even";
}

그러면 다음이 출력됩니다.

out 1
out 2 is even
out 3
out 4 is even
out 5
out 6 is even
out 7
out 8 is even
out 9
out 10 is even

PHP 5.5 이상에서 테스트되었습니다.


3
이것은 PHP 질문이 아닙니다.
Geoffrey

-4

Switch는 루프로 간주되지 않으므로 switch의 case 문 내에서 Continue를 사용할 수 없습니다 .


3
switch문은 내부에 while있으므로, 루프를 continue완벽하게 유효합니다.
Rick
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.