Это действительно странно. Таким образом, у меня есть этот простой оператор 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++, есть ли лучший способ включить несколько вариантов для одного случая?
||
является логическим ИЛИ. Его операнды преобразуются в bool
- zeroes в false
, а все остальные - в true
. Результатом является либо true
либо false
, который затем преобразуется в 1
и 0
соответственно. Таким образом, все четыре ваших случая эквивалентны case 1:
и компилятор жалуется, потому что вы не можете иметь две константы одного и того же значения в одном и том же операторе switch
.
Вы хотите:
case 'A':
case 'a':
cout << "hello"; break;
который использует преимущества спада.
case 'A' || 'a':
case 'A' || 'a':
→ case 1:
Вывод логических операторов может быть истинным (1) или ложным (0), поэтому компилятор будет иметь несколько ящиков с 0 и 1.
Поэтому невозможно определить, в каком случае позвонить.
||
имеет очень специфическое значение. Это не так близко, как английское соединениеor
.