문제의 역사:
switch 연산자는 표현식의 값에 따라 여러 분기로의 제어를 편리하게 분배하기 위해 C 언어에 도입되었습니다. 이는 큰 if-else 체인의 대안이며, 명령, 상태 및 열거형 값 처리에 널리 사용됩니다.
문제:
switch 연산자와 관련된 주요 위험은 잊혀진 break 연산자, 의도치 않게 "흘러내리기" (fallthrough)가 발생하는 것, 블록 내에서 선언된 변수와의 복잡성, 그리고 표현식의 유형이 정수여야 한다는 것입니다.
해결책:
안전한 사용을 위해:
break를 사용하세요 (또는 fallthrough 필요성을 주석으로 명시하십시오);int 또는 그와 호환되지 않은 유형을 사용하지 마십시오;case에 지정되지 않은 모든 값을 default 분기에서 처리하십시오;case 구조 외부 또는 {} 블록에서만 선언하십시오.코드 예:
#include <stdio.h> void print_day(int day) { switch (day) { case 1: printf("월요일 "); break; case 2: printf("화요일 "); break; case 3: printf("수요일 "); break; case 4: printf("목요일 "); break; case 5: printf("금요일 "); break; case 6: case 7: printf("주말 "); break; default: printf("알 수 없는 날 "); } }
주요 특징:
case에서 다른 case로의 "흘러내리기"는 break 없이 자동으로 발생합니다.switch 표현식에서 float 유형을 사용할 수 있습니까?
아니요. C 언어 표준에서는 switch의 표현식이 정수이어야 하거나 정수형으로 변환되어야 한다고 요구합니다 (char, short, int, long, enum 등).
case들을 위치를 바꾸면 어떻게 되나요 — 순서가 논리에 영향을 미칩니까?
switch 내의 case 선언 순서는 필요한 값을 찾는 데 영향을 미치지 않습니다. 코드는 일치하는 case부터 첫 번째 break까지 실행됩니다. 그러나 순서는 break가 없는 경우에 영향을 미칩니다 (fallthrough).
중괄호 없이 case 내에서 변수를 선언할 수 있습니까?
아니요. 추가 블록 {} 없이 case 뒤에 변수를 선언하면 컴파일 오류가 발생합니다. 올바른 방법은:
switch (x) { case 1: { int y = 0; break; } }
대규모 프로젝트에서 프로그래머가 하나의 case 뒤에 break를 잊어버려 여러 분기가 연속으로 잘못 실행되는 오류를 받았습니다. 버그는 사용자가 발견했습니다.
장점:
단점:
흘러내리기가 필요할 때 주석을 달아 fallthrough을 사용하고, 모든 중요한 case에서 break 또는 return을 사용하며, default에 경고 메시지를 출력하는 경우입니다.
장점:
단점: