switch 문에서 continue 사용 case B:

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 ++의 동작이 다른가요?



답변

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

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

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

예를 들면 :

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


답변

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


답변

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

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

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

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


답변

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

좋은 스타일을 사용하려면 모든 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...
}

…괜찮아.


답변

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

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

어때

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

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


답변

이것은 메가 비트에서 늦을 수 있지만 사용할 수 있습니다 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 이상에서 테스트되었습니다.


답변

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