C++ Chapter 5.1 : 조건 분기 (if문, switch-case문)
카테고리: Cpp
태그: Cpp Programming
인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!
조건분기
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”만 출력
- 만약 x 가 1이면 case1에 걸리고 밑에있는 case2까지 순차적으로 실행되어
-
-
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 유지
- case0 에서 b=2 했어도 case1 에서는 b=2 메모리 할당받은 값이 사라짐
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 값 할당을 만나지 못해 쓰레기 값이 출력되게 되는 것이다.
- 어떤 case에서 선언된 변수든 다 사용가능하므로
{ 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 에서도 쓰레기 값 없이 제대로 된 값 출력가능
- 변수 선언은 switch 어디에서든 가능하다. case안에서도, case 시작 전 공간에도.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기