조건문이란?
조건문을 사용하면 어떤 값이 참 또는 거짓인지에 따라 주어진 코드를 실행할지 결정할 수 있다.
1. if/else 문
가장 흔히 사용하며 else 문과 함께 쓸 수 있다.
if 문에 나온 조건이 참이면 if 문에 속한 코드를 실행한다.
조건이 참이 아니면 if 블록을 빠져나와 그 뒤의 문장을 실행한다.
if (i > 4) {
// 뭔가 작업한다.
} else if (i > 2) {
// 다른 일을 한다.
} else {
// 다른 일을 한다.
}
if 문 뒤의 소괄호 안에는 반드시 불(bool) 타입의 값을 지정하거나 평가 결과가 불값인 표현식을 지정해야 한다.
여기서 0은 false를 의미하고, 0이 아닌 값은 true를 의미한다.
if(0)은 if(false)와 같다.
if 문의 이니셜라이저
C++17부터 if 문 안에 이니셜라이저(초기자)를 넣는 기능이 추가됐다.
if (<이니셜라이저> ; <조건문>) { <본문> }
<이니셜라이저>에서 정의한 변수는 <조건문>과 <본문> 안에서만 사용할 수 있고 if 문 밖에서는 사용할 수 없다.
다음은 개략적인 형태의 코드이다.
if (Employee employee = GetEmployee() ; employee.salary > 1000) { ... }
여기서 <이니셜라이저>으로 직원 정보를 가져와서 조건문에서 그 직원의 급여가 1000 이상인지 확인하고,
이를 만족하면 본문에 나온 코드를 실행한다.
2. switch 문
switch 문은 조건으로 지정한 표현식의 결과에 따라 수행할 동작을 선택한다.
switch 문 안에는 다양한 값의 상숫값들을 case 문으로 지정할 수 있다.
switch 문에 지정한 표현식의 결과와 일치하는 case가 있으면 그 아래에 나오는 코드를 실행하다가 break 문이 나오면 멈춘다. default란 키워드는 case 문에서 일치하는 것이 하나도 발견되지 않을 때 실행한다.
siwtch (menuItem) {
case OpenMenuItem:
// 파일을 여는 코드
break;
case SaveMenuItem:
// 파일을 저장하는 코드
break;
default:
// 에러 메시지를 출력하는 코드
break;
}
switch 문을 if/else 문으로 변환할 수도 있다.
if (menuItem == OpenMenuItem) {
// 파일을 여는 코드
} else if (menuItem == SaveMenuItem) {
// 파일을 저장하는 코드
} esle {
// 에러 메시지를 출력하는 코드
}
switch 문의 조건으로 지정한 값과 일치하는 case 문이 있다면 그 아레 나오는 문장을 break 문이 나타날 때까지 실행한다.
break 문이 없다면 다음에 나오는 case 문도 계속해서 실행하는데, 이렇게 실행되는 것을 폴스루(흘려보내기)라 부른다.
다음 코드는 여러 case 문에 대해 동일한 코드 블록을 실행하도록 폴스루 방식으로 작성한 예를 보여준다.
switch (backgroundColor) {
case Color::DarkBlue:
case Color::Black:
// 배경색이 진청 혹은 검정일 때 실행될 코드
break;
case Color::Red:
// 배경색이 빨강일 때 실행될 코드
break;
}
폴스루 방식은 버그가 발생하기 쉽다.
중간에 break 문을 깜박 잊고 빠뜨렸을 경우가 있기 때문이다.
컴파일러는 위 예제처럼 케이스가 비어 있지 않으면 경고 메시지를 발생한다.
C++17부터 다음과 같이 [[fallthrough]] 속성을 지정해서
의도적으로 폴스루 방식으로 작성했다고 컴파일러에 알려줄 수 있다.
#include <iostream>
using namespace std;
void dosomethingForDarkBlue() {
cout << "DarkBlue" << endl;
}
void dosomethingForBlackOrDarkBlue() {
cout << "Black" << endl;
}
enum class Color{
DarkBlue,
Black,
Red,
Green
};
int main()
{
Color backgroundColor = Color::DarkBlue;
switch (backgroundColor) {
case Color::DarkBlue:
// 배경색이 진청일 때 실행될 코드
dosomethingForDarkBlue();
[[fallthrough]];
case Color::Black:
// 배경색이 진청 혹은 검정일때 실행될 코드
dosomethingForBlackOrDarkBlue();
break;
case Color::Red:
[[fallthrough]];
case Color::Green:
// 배경색이 빨강이거나 초록일 때 실행될 코드
break;
}
return 0;
}
결과
Switch 문의 이니셜라이저
C++17부터 if 문처럼 switch 문도 이니셜라이저를 지정할 수 있다.
switch (<이니셜라이저> ; <표현식>) { <본문> }
<이니셜라이저>에서 선언한 변수는 <표현식>과 <본문> 안에서만 사용할 수 있다.
switch 문 밖에서는 사용할 수 없다.
3. 조건 연산자
조건 연산자는 인수 세 개를 받는 유일한 삼항 연산자이다.
이 연산자는 [조건]을 만족하면 [동작1]을 수행하고, 그렇지 않으면 [동작2]를 수행한다.
[조건] ? [동작1] : [동작2]로 간략히 표현한다.
std::cout << ((i > 2) ? "yes" : "no");
i > 2를 소괄호로 묶는 것은 선택사항이다.
std::cout << (i > 2 ? "yes" : "no");
i가 2보다 크면 "yes"를, 그렇지 않으면 "no"를 출력한다.
'💻프로그래밍 내용 정리 > C++17' 카테고리의 다른 글
[C++ 1.1.9] 함수, 함수 선언, 함수 정의, 함수 리턴 타입 추론(auto), 현재 함수 이름(__func__) (0) | 2022.08.15 |
---|---|
[C++ 1.1.8] 논리 연산자(<, <=, >, >=, ==, !=, !, &&, ||), 단락 논리 (0) | 2022.08.15 |
[C++ 1.1.6] 상수와 타입(enum), 엄격한 타입(enum class(스트롱 타입)), 구조체(struct) (0) | 2022.08.15 |
[C++ 1.1.5] 연산자(단항, 이항, 비트 연산자) (0) | 2022.08.15 |
[C++ 1.1.4] 변수, 캐스팅(동적 형변환, static_cast) (0) | 2022.08.15 |