Оператор переключения C ++ не позволяет мне использовать более одного «или»? Какая? [Дубликат]

0

Это действительно странно. Таким образом, у меня есть этот простой оператор switch-case, который должен выполнять действия, если пользователь вводит в строчную или строчную версию буквы:

switch (choice)
{
case 'A' || 'a':
    cout << "hello"; break;
case 'B' || 'b':
    cout << "hello"; break; 
case 'C' || 'c': 
    cout << "hello"; break;
case 'D' || 'd': 
    cout << "hello"; break; 
}

MS Visual Studio дает мне три ошибки для случаев "B"/"b", "C"/"c" и "D"/"d", каждая из которых говорит следующее:

IntelliSense: case label value has already appeared in this switch 

Это НЕ дает мне эту ошибку с помощью "A"/"a" - и если я избавлюсь от случая A, это позволяет случай B, но не следующие случаи. Я не могу думать о какой-либо причине, почему это должно быть хорошо с первым "или" случаем, но затем расстраиваться в следующих случаях.

Контекст: запись класса контейнера, и этот код находится за пределами основной функции, но я не думаю, что это имеет к этому какое-то отношение.

Есть предположения? И если это не допустимо в C++, есть ли лучший способ включить несколько вариантов для одного случая?

  • 3
    || имеет очень специфическое значение. Это не так близко, как английское соединение or .
Теги:
switch-statement
visual-studio-2013

2 ответа

7
Лучший ответ

|| является логическим ИЛИ. Его операнды преобразуются в bool - zeroes в false, а все остальные - в true. Результатом является либо true либо false, который затем преобразуется в 1 и 0 соответственно. Таким образом, все четыре ваших случая эквивалентны case 1: и компилятор жалуется, потому что вы не можете иметь две константы одного и того же значения в одном и том же операторе switch.

Вы хотите:

case 'A':
case 'a':
    cout << "hello"; break;

который использует преимущества спада.

1

case 'A' || 'a': case 'A' || 'a': → case 1:

Вывод логических операторов может быть истинным (1) или ложным (0), поэтому компилятор будет иметь несколько ящиков с 0 и 1.

Поэтому невозможно определить, в каком случае позвонить.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню