Есть несколько вещей, которые нужно помнить о выражениях регистра переключателя:
a) Условие должно быть целочисленным / перечислимым / определяемым пользователем типом, который поддерживает преобразование в int или enum
b) метки case являются константами времени компиляции
в) Никакие два выражения метки регистра не могут иметь одинаковое значение
d) $ 6.4.2 / 5- "Когда выполняется оператор switch, его условие оценивается и сравнивается с каждой константой case. Если одна из констант case равна значению условия, управление передается оператор после метки совпадающего регистра. Если никакая константа регистра не соответствует условию и если есть метка по умолчанию, управление переходит к оператору, помеченному меткой по умолчанию. Если регистр не соответствует и если по умолчанию нет, то ни один из операторов в переключатель выполнен. "
e) $ 6.4.2 / 6 - «метки case и default сами по себе не изменяют поток управления, который беспрепятственно продолжается через такие метки. Чтобы выйти из коммутатора, см. Break»
enum direction {north, south, east, west};
char x;
class UD{
operator int(){return 0;}
};
direction f1(){
return north;
}
char f2(){
return 'A';
}
int main(){
direction d = f();
string country;
// switch condition of type enum
switch(d){
case north:
country = "P";
break;
case south:
country = "Q";
break;
case east:
country = "R";
break;
case west:
country = "S";
break;
default:
country = "";
break;
}
// switch condition of integral type
switch(c){
case 'A':
case 'E':
case 'I':
case 'O':
case 'U':
cout << "Vowel";
break;
default:
cout << "Not a Vowel";
break;
}
UD u;
// switch condition of user defined type (conversion to integral type)
switch(u){
case 0:
case 1:
cout << "Good";
break;
default:
cout << "Not so good";
break;
}
}