스위치의 케이스를 건너뛰기 위해 if(0)를 사용하는 것은 기능합니까?
C++ 스위치스테이트먼트의 2개의 케이스가 모두 3번째 케이스로 넘어갔으면 하는 상황이 있습니다.구체적으로는 두 번째 케이스가 세 번째 케이스로 넘어가고 첫 번째 케이스도 두 번째 케이스로 넘어가지 않고 세 번째 케이스로 넘어갑니다.
멍청한 생각이 나서 시도해 봤는데 효과가 있었어!두 번째 케이스를 싸서if (0) {
...}
. 다음과 같습니다.
#ifdef __cplusplus
# include <cstdio>
#else
# include <stdio.h>
#endif
int main(void) {
for (int i = 0; i < 3; i++) {
printf("%d: ", i);
switch (i) {
case 0:
putchar('a');
// @fallthrough@
if (0) { // fall past all of case 1 (!)
case 1:
putchar('b');
// @fallthrough@
}
case 2:
putchar('c');
break;
}
putchar('\n');
}
return 0;
}
실행 시 원하는 출력을 얻을 수 있습니다.
0: ac
1: bc
2: c
C와 C++(둘 다 쨍그랑)로 시도해보니 똑같이 동작했어요.
질문입니다.이것이 유효한 C/C++입니까?원래 이렇게 하는 거야?
네, 이게 효과가 있을 거예요.C의 스위치스테이트먼트의 케이스 라벨은 goto 라벨과 거의 동일합니다(네스트된 스위치스테이트먼트에서의 동작에 관한 주의사항이 있습니다).특히 케이스 내부라고 생각되는 스테이트먼트에 대해서는 블록 자체를 정의하지 않기 때문에 Goto와 마찬가지로 블록의 한가운데로 점프할 수 있습니다.블록의 중앙으로 뛰어드는 경우 변수 초기화 등의 점프에 대해서는 goto와 동일한 주의사항이 적용됩니다.
그렇긴 하지만 실제로는 다음과 같이 goto 문장으로 작성하는 것이 더 명확할 것입니다.
switch (i) {
case 0:
putchar('a');
goto case2;
case 1:
putchar('b');
// @fallthrough@
case2:
case 2:
putchar('c');
break;
}
네, 이건 허용되고 원하는 대로 할 수 있습니다.의 경우switch
C++ 규격에는 다음과 같이 기술되어 있습니다.
대/소문자 및 기본 라벨 자체는 제어 흐름을 변경하지 않으며 이러한 라벨 간에 방해받지 않고 계속됩니다.스위치를 종료하려면 , 「브레이크」를 참조해 주세요.
[주 1: 보통 스위치의 대상인 서브스테이트먼트는 복합적이며 (복합) 서브스테이트먼트에 포함된 최상위 스테이트먼트에 대소문자와 디폴트라벨이 표시됩니다만, 이것은 필수는 아닙니다.선언은 스위치스테이트먼트 서브스테이트먼트에 표시될 수 있습니다.- 종료 노트]
그래서 언제?if
스테이트먼트가 평가되고 제어 플로우가 다음 규칙에 따라 진행됩니다.if
문구를 지정합니다(간섭 케이스 라벨에 관계없이).
다른 답변에서 언급했듯이, 이것은 기술적으로 표준에 의해 허용되지만, 미래의 코드 독자들에게는 매우 혼란스럽고 불분명하다.
★★★★★switch ... case
문은 보통 함수 호출을 사용하여 작성해야 하며 많은 인라인 코드를 작성해서는 안 됩니다.
switch(i) {
case 0:
do_zero_case(); do_general_stuff(); break;
case 1:
do_one_case(); do_general_stuff(); break;
case 2:
do_general_stuff(); break;
default:
do_default_not_zero_not_one_not_general_stuff(); break;
}
언급URL : https://stackoverflow.com/questions/64475978/is-using-if-0-to-skip-a-case-in-a-switch-supposed-to-work
'sourcecode' 카테고리의 다른 글
gdb에 설정을 저장하는 방법 (0) | 2022.07.30 |
---|---|
어플리케이션 전체에 커스텀 폰트를 설정할 수 있습니까? (0) | 2022.07.30 |
Nuxt 구성 요소를 사용하여 vuex getter 메서드에 매개 변수를 전달하는 방법은 무엇입니까?(3개의 도트 표기법을 유지하면서) (0) | 2022.07.28 |
Nuxt.js가 RouteMiddleware에서 Vuex를 사용할 수 없음 (0) | 2022.07.28 |
특정 프로세스에 대해 런타임에 로드되는 공유 라이브러리를 확인하는 방법 (0) | 2022.07.28 |