[C++] 분기 구문과 논리 연산자
switch 구문
switch (integer-expression)
{
case lable1 : statement(s)
case lable2 : statement(s)
...
default : statement(s)
}
C++의 switch 구문은 다음 수행할 구문이 어느 행인지 알려 주는 경로 결정기처럼 행동한다. switch 구문에 도달하면 integer-expression의 값에 해당하는 레이블이 붙어 있는 행으로 프로그램이 점프한다.
프로그램이 switch의 특정 행으로 점프하면 명시적으로 흐름을 제어하지 않는 한 그 행 이후의 모든 구분들을 순차적으로 수행한다. 특정 구문들의 집합을 처리한 후 수행을 멈추게 하려면 특정 구문들의 집합 끝에 breck 구문을 사용한다.
break를 모두 제거하면 어떻게 될까? 예를 들어, break 구문들이 모두 제거된 상태에서 lable1이 입력된다면, 프로그램은 case 2, case 3, case 4와 default에 딸려 있는 모든 구문들을 차례대로 수행한다. C++가 이렇게 하는 이유는 이러한 행동이 유용한 경우가 있기 때문이다.
switch (choice)
{
case 'a' :
case 'A' : break;
case 'b' :
case 'B' : break;
case 'c' :
case 'C' : break;
default : cout << "end" << endl;
}
case 'a' 바로 뒤에 break 구문이 없기 때문에, 프로그램은 case ' A '에 붙어있는 구문으로 실행 흐름을 넘긴다.
switch와 if else
switch 구문과 if else 구문은 둘 다 여러 가지 선택 사항 중에서 어느 하나만을 선택할 때 사용하는 것이다. 그러나 if else 구문이 더 융통성이 있다. 예를 들어, if else는 다음과 같이 값의 범위를 다룰 수 있다.
if (age > 17 && age < 35)
index = 0;
else if (age >= 35 && age < 50)
index = 1;
else if (age >= 50 && age < 65)
index = 2;
else
index = 3;
한편, switch 구문은 값의 범위를 다룰 수 없다. swith의 각 case 레이블은 단일한 값이어야 한다. 또한 그 값이 (char형을 포함한) int형이어야 한다. 그래서 switch 구문은 부동 소수점수의 조건 검사를 처리할 수 없다. 그리고 case 레이블의 값도 상수여야 한다. 따라서 값의 범위를 포함하는 경우나, 부동 소수점의 조건 검사, 두 개의 변수를 비교할 때에는 if else를 사용해야 한다. 일반적으로 선택 사항의 수가 2개가 아니라면 switch가 코드 크기나 실행 속도 면에서 if else보다 훨씬 효율적이다.