Оператор switch - используя или?
Я создаю консольное приложение и использую оператор switch для создания простой системы меню. Пользователь вводится в виде одного символа, который отображается на экране как капитал. Тем не менее, я хочу, чтобы программа принимала символы нижнего и верхнего регистра.
Я понимаю, что переключатели используются для сравнения с константами, но можно ли сделать что-то вроде этого:
switch(menuChoice) {
case ('q' || 'Q'):
//Some code
break;
case ('s' || 'S'):
//More code
break;
default:
break;
}
Если это невозможно, есть ли работа, так как я действительно не хочу повторять код - такой короткий, как повторы.
Ответы
Ответ 1
Таким образом:
switch(menuChoice) {
case 'q':
case 'Q':
//Some code
break;
case 's':
case 'S':
//More code
break;
default:
}
Подробнее об этой теме:
http://en.wikipedia.org/wiki/Switch_statement#C.2C_C.2B.2B.2C_Java.2C_PHP.2C_ActionScript.2C_JavaScript
Ответ 2
Общепринятым синтаксисом для этого является:
switch(menuChoice) {
case 'q':
case 'Q':
//Some code
break;
case 's':
case 'S':
//More code
break;
default:
break;
}
i.e: Из-за отсутствия break
выполнение программы каскадируется в следующий блок. Это часто называют "проваливанием".
Тем не менее, вы можете, конечно, просто нормализовать случай переменной "menuChoice" в этом случае через toupper/tolower.
Ответ 3
Просто используйте tolower()
, здесь мой человек:
СИНТАКСИС
#include ctype.h
int toupper(int c);
int tolower(int c);
ОПИСАНИЕ toupper() преобразует букву c в верхний регистр, если это возможно.
tolower() converts the letter c to lower case, if possible.
If c is not an unsigned char value, or EOF, the behavior of these
functions is undefined.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ Возвращаемое значение - это преобразованная буква, или c, если преобразование было невозможно.
Итак, в вашем примере вы можете switch()
с помощью:
switch(tolower(menuChoice)) {
case('q'):
// ...
break;
case('s'):
// ...
break;
}
Конечно, вы можете использовать как toupper()
, так и tolower()
, с заглавными и непрописными буквами.
Ответ 4
Вы можете (и по соображениям повторения), прежде чем вводить оператор switch, использовать tolower fnc на вашем var.
Ответ 5
'q' || 'Q'
приводит к результату типа bool (true), который продвигается к интегральному типу, используемому в состоянии переключения (char), - давая значение 1. Если компилятор разрешил использовать одно значение (1) в нескольких меток, во время выполнения оператора switch menuChoice
будет сравниваться со значением 1 в каждом случае. Если menuChoice
имеет значение 1, тогда код под первой меткой case был бы выполнен.
Поэтому предлагаемые ответы здесь используют символьную константу (которая имеет тип char) как интегральное значение в каждой метке case.
Ответ 6
switch (toupper(choice))
{
case 'Q':...
}
... или tolower.