본문 바로가기
C │ C++ │ C#/C++

C++ Chapter 5.1 : 조건 분기 (if문, switch-case문)

by Pokaa 2023. 8. 22.
728x90
728x90
SMALL

조건분기

 

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 에서도 쓰레기 값 없이 제대로 된 값 출력가능

728x90
300x250
LIST