숏컷 코드
if, if-else, if-else if-else는 서로 다른 상황을 위한 기본형입니다.
if (ready) { start(); }
if (score >= 60) { pass(); }
else { fail(); }
if (score >= 90) { grade = 'A'; }
else if (score >= 80) { grade = 'B'; }
else { grade = 'F'; }문법
if 계열은 조건식을 검사한 뒤 분기 본문을 실행하는 문장입니다. 기본형은 if, if-else, if-else if-else 세 가지로 보면 되고, 삼항 연산자는 문장 대신 값 하나를 고르는 표현식으로 구분하는 편이 좋습니다.
if (condition) {
/* true일 때만 실행 */
}
if (condition) {
/* true */
} else {
/* false */
}아래 예시는 이 기본형이 실제 코드에서 어떻게 쓰이는지 조금 더 정확하게 풀어 쓴 버전입니다.
if만 쓰는 경우
if (ptr != NULL) {
process(ptr);
}조건이 참일 때만 추가 동작을 넣으면 될 때 쓰기 좋습니다. 포인터 검사, 옵션 처리, 조기 반환처럼 한쪽만 특별히 처리하면 되는 상황에 잘 맞습니다.
if-else로 둘 중 하나를 고르는 경우
if (score >= 60) {
result = "pass";
} else {
result = "fail";
}성공/실패처럼 둘 중 하나가 반드시 실행돼야 할 때 가장 읽기 쉽습니다.
if-else if-else로 여러 구간을 나누는 경우
if (score >= 90) {
grade = 'A';
} else if (score >= 80) {
grade = 'B';
} else if (score >= 70) {
grade = 'C';
} else {
grade = 'F';
}여러 구간이나 상태를 위에서 아래로 판정할 때 씁니다. 이 구조는 처음 참이 되는 분기에서 멈추기 때문에 조건 순서가 결과를 직접 바꿉니다.
if (score >= 60) {
result = "pass";
} else if (score >= 90) {
result = "A"; /* 절대 도달하지 않음 */
}그래서 더 좁은 조건을 위에, 더 넓은 조건을 아래에 두는 편이 맞습니다.
짧은 값 선택은 삼항 연산자
const char *label = (count == 1) ? "item" : "items";짧은 값 하나를 고를 때는 괜찮지만, 본문이 길어지면 if보다 읽기 어려워집니다.
분기 흐름
if는 조건이 참일 때만 어떤 동작을 추가로 실행하면 될 때 씁니다.if-else는 둘 중 하나가 반드시 실행돼야 할 때 가장 읽기 쉽습니다.if-else if-else는 여러 구간이나 상태를 위에서 아래로 판정할 때 씁니다.- 삼항 연산자는 짧은 값 선택에는 좋지만, 본문이 길어지면
if보다 읽기 어려워집니다.
if (score >= 60) { result = "pass"; }
else if (score >= 90) { result = "A"; } /* 도달 불가 */포인터나 배열 접근이 들어간 조건은 안전 검사부터 왼쪽에 두는 편이 중요합니다. 짧은 평가 덕분에 왼쪽이 거짓이면 오른쪽은 실행되지 않으므로, 잘못된 역참조를 피할 수 있습니다.
if (ptr != NULL && *ptr > 0) {
process(*ptr);
}반대로 이 순서는 위험합니다.
if (*ptr > 0 && ptr != NULL) {
process(*ptr);
}주의할 점
조건문에서 =와 ==를 혼동하면 비교가 아니라 대입이 됩니다.
if (status = 1) {
/* 대입 */
}
if (status == 1) {
/* 비교 */
}=는 대입이고==는 비교입니다. 조건식에서 둘을 헷갈리면 분기 전체가 틀어집니다.- 범위 비교는 더 좁은 조건을 먼저 두고, 넓은 조건을 뒤로 보냅니다.
- 포인터나 배열 접근은 안전 검사 조건을 왼쪽에 둬서 짧은 평가를 활용합니다.
- 부동소수점은
==직접 비교보다 허용 오차 비교가 안전한 경우가 많습니다.
참고 링크
1 sources