숏컷 코드
cpp
// 기본 분기
if (score >= 90) {
grade = 'A';
} else if (score >= 80) {
grade = 'B';
} else {
grade = 'C';
}
// C++17: 초기화 + 조건을 한 줄에
if (auto result = find(key); result != end()) {
process(*result);
}if, else if, else는 범위와 조건을 위에서 아래로 나누는 기본 분기이고, C++17부터는 조건식 안에서만 쓸 변수를 같이 선언할 수 있습니다.
문법
조건문 카드에서 먼저 다시 보는 기본형은 아래입니다.
- 단일 분기:
if - 둘 중 하나:
if / else - 범위별 분기:
if / else if / else - 조건 안쪽 전용 변수:
if (init; condition)
단락 평가 — &&와 ||의 실행 보장
&&와 ||는 왼쪽 피연산자만으로 결과가 확정되면 오른쪽을 아예 평가하지 않습니다. 이 단락 평가(short-circuit evaluation)를 활용하면 포인터 유효성 검사와 실제 사용을 한 조건에 안전하게 담을 수 있습니다.
cpp
// ❌ ptr이 null이면 역참조에서 크래시
if (ptr != nullptr && ptr->value > 0) { ... } // 이것은 ✅
// nullptr일 때 오른쪽을 평가하지 않아 안전
if (ptr && ptr->isValid()) { ... } // ✅ && 단락 평가
// || — 첫 번째가 true면 두 번째 건너뜀
if (cache.has(key) || compute(key) > 0) { ... }
// ^^ cache hit이면 compute 호출 안 함C++17 if 초기화 문
if (init; condition) 형식으로 조건 검사에 사용할 변수를 if 블록 안으로 제한할 수 있습니다. 변수가 불필요하게 외부 스코프로 새어나가는 것을 방지합니다.
cpp
// ❌ iter가 if 블록 밖에서도 보임
auto it = map.find(key);
if (it != map.end()) {
use(it->second);
}
// ✅ C++17 — it의 스코프가 if 블록 안으로 제한
if (auto it = map.find(key); it != map.end()) {
use(it->second);
}조건 가독성 개선
조건이 복잡해지면 의미 있는 이름의 변수나 함수로 뽑아내면 읽기 좋아집니다.
cpp
// ❌ 조건이 길어 의미 파악이 어려움
if (user.age >= 18 && user.score >= 60 && !user.isBanned && user.hasPaid) {
grant_access();
}
// ✅ 의미 단위로 분리
bool is_adult = user.age >= 18;
bool passed_exam = user.score >= 60;
bool is_eligible = is_adult && passed_exam && !user.isBanned && user.hasPaid;
if (is_eligible) {
grant_access();
}cpp
// ❌ 더 넓은 조건을 먼저 두면 아래 분기가 죽는다
if (score >= 60) {
grade = 'P';
} else if (score >= 90) {
grade = 'A';
}
// ✅ 더 좁은 범위를 먼저 둔다
if (score >= 90) {
grade = 'A';
} else if (score >= 60) {
grade = 'P';
}체크포인트
- 범위 비교와 복합 조건:
if / else if - 하나의 정수·enum 분기:
switch도 같이 검토 - 포인터/컨테이너 안전 접근:
&&단락 평가 - 조건 안에서만 쓰는 변수:
if (init; cond) - 단순 값 선택만 필요: 삼항 연산자도 가능
주의할 점
=(대입)과 ==(비교)를 혼동하면 조건이 항상 참이 되는 버그가 생깁니다.
cpp
int code = 0;
// ❌ 대입 — code에 1이 들어가고, 조건은 항상 true
if (code = 1) {
process();
}
// ✅ 비교
if (code == 1) {
process();
}
// 실수를 막는 Yoda 조건 — 상수를 왼쪽에
if (1 == code) { ... } // = 1이면 컴파일 오류
// 또는 컴파일러 경고 활성화: -Wparentheses (GCC/Clang)cpp
// ❌ null 검사보다 역참조가 먼저 오면 크래시 가능
if (ptr->value > 0 && ptr != nullptr) { }
// ✅ 안전한 순서로 배치
if (ptr != nullptr && ptr->value > 0) { }참고 링크
1 sources