조건분기
if 조건문
- 한 문장일때는 중괄호 블럭 생략 가능
- if$($true$)$ : 항상 실행
- if, else 중괄호 블럭 안에서 변수 선언하면 그 블록안에서만 유효한 지역변수
- else 는 가장 가까운 위치의 if 와 대응한다.
ο 그러니 항상 같은 짝 if-else 끼리는 중괄호로 묶어주고 위치를 맞추자
if (x >= 10)
**if** (x < 20)
cout >> "x is between 10 and 20 " << endl;
**else**
cout >> "... " << endl;
ο 이 else 는 이 if 와 연결된다.
- if $($ x = 0$)$ 와 if $($ x == 0$)$ 는 다른 점
ο if $($ x = 0$)$ → if $($ 0 $)$ 과 같다. 0이 x 에 대입되어서 … 무조건 실행이 안되겠지.
ο if $($ x == 0$)$ → x 가 0과 같은지 조건식 따짐. x가 0이면 실행되고 0이 아니면 실행 안됨
switch-case문
- case 하나 걸리면 그 밑의 case들까지 다 실행된다.
ο 따라서 해당되는 case 하나만 실행시키려면 break 넣기
switch(x)
{
case 0:
cout << "Zero";
case 1:
cout << "One";
case 2:
cout << "Two";
■ 만약 x 가 1이면 case1에 걸리고 밑에있는 case2까지 순차적으로 실행되어
■ “OneTwo” 출력
switch(x)
{
case 0:
cout << "Zero";
break;
case 1:
cout << "One";
break;
case 2:
cout << "Two";
break;
■ 이제 딱 case 1만 실행되고 빠져나와 “One”만 출력
- enum (내부적으로 정수값) 과 함께 쓸때
ο
enum class Colors
{
BLACK,
WHITHE,
RED,
GREEN,
BLUE
};
void printColorName(**Colors color**)
{
switch (color)
{
case Colors::BLACK:
cout << "black";
break;
case Colors::WHITHE:
cout << "white";
break;
case Colors::RED:
cout << "red";
break;
}
cout << endl;
}
int main()
{
printColorName**(**Colors::BLACK);
return 0;
}
ο 이렇게 복잡하게 쓰기보다 그냥 case 0:, case1: 이렇게 쓰고 싶다면 아래와 같이 형 변환하기
enum class Colors
{
BLACK,
WHITHE,
RED,
GREEN,
BLUE
};
void printColorName(**Colors color**)
{
switch (**static_cast<int>(color)**)
{
case **0:**
cout << "black";
break;
case **1:**
cout << "white";
break;
case **2:**
cout << "red";
break;
}
cout << endl;
}
int main()
{
printColorName(Colors::BLACK);
return 0;
}
default :
- 모든 case에 안걸렸던 것들 처리
주의사항
- switch에서 한 변수선언은 모든 case에서 사용 가능하다.
- 단 값 할당, 초기화에서 문제가 있음
switch(x)
{
int a; // 가능함.
int b = 1; // 오류 ! ! **이 공간에선 메모리 할당 안됨.** 즉 변수 선언은 가능하나 초기화는 안된다.
case 0 :
a = 1; // 가능함. 값 할당은 case 안에서만 ! **a는 case 시작 전 공간에서 선언된 변수**
}
ο 변수 선언은 switch 어디에서든 가능하다. case안에서도, case 시작 전 공간에도.
■ 어느 case에서 선언된 변수든 모든 case에서 사용 가능하다.
■ 단 값 할당은 case 안에서만 가능하다.
■ case 시작 전 공간에서는 case에 막혀 메모리 할당이 되지 않는다.
■ 해당 case를 벗어나면 메모리 할당 받은것도 사라진다.
■ case0 에서 b=2 했어도 case1 에서는 b=2 메모리 할당받은 값이 사라짐
■ break가 없어서 case0, case1 다 들리더라도 !!
■ 메모리 할당은 해당 case 범위에서만 유지된다.
■ 변수 선언은 전체 switch 유지
switch(x)
{
int a; // 가능함.
case 0 :
int b;
b = 2; // 가능함. 값 할당은 case 안에서만 !
a = 1; // 가능함. 값 할당은 case 안에서만 !
case 1 :
cout << b << endl; // case 0 에서 선언된 b를 case1에서도 사용 가능하다.
}
ο 단 case 1에 해당된다면 쓰레기값이 출력될 것이다.
■ 어떤 case에서 선언된 변수든 다 사용가능하므로
■ int b는 실제로 존재하는 변수고 case 1에서도 사용 가능하지만
■ case0에서의 b = 2 값 할당을 만나지 못해 쓰레기 값이 출력되게 되는 것이다.
{
int b = 2; // 이렇게 switch에서만 사용할 변수를 미리 switch 문 전에 선언해놓는것을 추천
switch(x)
{
int a; // 가능함.
case 0 :
b = 4; // 가능함. 값 할당은 case 안에서만 !
a = 1; // 가능함. 값 할당은 case 안에서만 !
case 1 :
cout << **b** << endl; // case 0 에서 선언된 b를 case1에서도 사용 가능하다.
}
}
ο 이제 b는 switch문에서 선언된게 아닌 바깥에서 선언된 b이므로 case1 에서도 쓰레기 값 없이 제대로 된 값 출력가능
'C │ C++ │ C# > C++' 카테고리의 다른 글
C++ Chapter 5.3 : 난수 만들기 (0) | 2023.08.23 |
---|---|
C++ Chapter 5.2 : 반복문$($while, do-while, for$)$과 점프$($break, continue, goto$)$ (0) | 2023.08.22 |
C++ Chapter 4.8 : 구조체 (0) | 2023.08.21 |
C++ Chapter 4.7 : 기존 자료형에게 가명 붙여주기 (0) | 2023.08.21 |
C++ Chapter 4.6 : 열거형과 열거형 클래스 (1) | 2023.08.20 |