2016-01-29 3 views
1

Я новичок в C++, я пытаюсь написать код для оценки значения, введенного пользователем переменной с типизированным символом, и его имя является «ответом», используя оператор switch, который будет работать с 2 случаяОшибка C2196 в заявлении коммутатора

случай 1: если ответ у (в нижнем регистре) или Y (в верхнем регистре) он будет выводить сообщение в окне консоли

случай 2: если ответ является н (в нижнем регистре) или N (верхний регистр), он напечатает другое сообщение в окне консоли

, но я столкнулся с проблемой с кодом, который сгенерировал ошибку C2196, я искал ее на msdn и i und erstand что это значит, но еще и не может исправить эту ошибку

#include<iostream> 
using namespace std; 
int main() 
{ 
    char response; 
    cout << " Enter your response " << endl; 
    cin >> response; 
    switch (response) 
    { 
    case 'y' || "Y": 
     cout << "You chose y or Y " << endl; 
     break; 
    case 'n' || 'N': 
     cout << "You chose n or N " << endl; 
     break; 
    default: 
     cout << "You didn't choose a valid option " << endl; 
     break; 
    } 
    return 0; 
} 
+0

http://www.cplusplus.com/doc/tutorial/control/ –

+1

Если вы используете верхний или нижний регистр ввода, вам нужно сравнить только один символ символа, а не нижний и верхний регистры. – EdChum

+0

Это также поможет много, если вы будете использовать верхний/нижний регистр и пунктуацию в тексте. Это боль, чтобы прочитать вопрос – user463035818

ответ

2

case этикетки не if заявления. Вы не можете or их. Вместо этого вы можете иметь несколько ярлыков с тем же кодом. Например:

case 'y': 
    case 'Y': 
     cout << "You chose y or Y " << endl; 
     break; 

Помните, switch() на самом деле в маскировать goto. case ярлыки - это действительно goto ярлыки, поэтому у вас не может быть никаких логических операций над ними. Он также позволяет вам «комбинировать» ярлыки меток вместе, как я показал - после того, как управление было перенесено на первый ярлык, оно продолжается до второго, пока оно не увидит break.

На стороне записки, вы не можете использовать двойные кавычки, чтобы представить один символ, как вы делаете с вашим капиталом Y.

0

switch управление потоком ищет постоянные значения среди case с. См. here.

Чтобы выполнить то, что вы пытаетесь сделать, вы можете использовать переключатель-дело так:

enter code here 
#include<iostream> 
using namespace std; 
int main() 
{ 
    char response; 
    cout << " Enter your response " << endl; 
    cin >> response; 
    switch (response) 
    { 
    case 'y': 
    case 'Y': 
     cout << "You chose y or Y " << endl; 
     break; 
    case 'n': 
     //since there is no 'break;' statement here, either cases will perform the code 
    case 'N': 
     cout << "You chose n or N " << endl; 
     break; 
    default: 
     cout << "You didn't choose a valid option " << endl; 
     break; 
    } 
    return 0; 
} 
0

case 'y' || "Y" не делать то, что вы ожидали. Вы используете логический || здесь, который всегда будет возвращать true, а для char это означает 1. И это же для case 'n' || 'N', так что вы написали два case 1: действительно здесь, именно поэтому вы получили сообщение об ошибке:

ошибка C2196: случай значение «1» уже используется

Вы можете

switch (response) 
{ 
case 'y': 
case 'Y': 
    cout << "You chose y or Y " << endl; 
    break; 
case 'n': 
case 'N': 
    cout << "You chose n or N " << endl; 
    break; 
default: 
    cout << "You didn't choose a valid option " << endl; 
    break; 
} 
0

Существует несколько проблем с кодом.

Вы можете проверить только одно значение в каждом заявлении case. Вы должны написать

switch (response) 
{ 
case 'y': 
case 'Y': 
    cout << "You chose y or Y " << endl; 
    break; 
case 'n': 
case 'N': 
    cout << "You chose n or N " << endl; 
    break; 
default: 
    cout << "You didn't choose a valid option " << endl; 
    break; 
} 

для тестирования различных значений, которые будут иметь тот же эффект.

Кроме того, что вы на самом деле тестируете, это response == true.В булевом выражении все, что не равно 0, обрабатывается как true, поэтому оба 'y' и "Y": true и 'y'||"Y" оцениваются как true. То же самое касается 'n' и 'N'. То, что вы в настоящее время тестирования является

switch (response) 
{ 
case (char)true: 
    cout << "You chose y or Y " << endl; 
    break; 
case (char)true: 
    cout << "You chose n or N " << endl; 
    break; 
default: 
    cout << "You didn't choose a valid option " << endl; 
    break; 
} 

В обоих случаях проверить, если response является (char)true, таким образом, вы получите ошибку C2196, что означает «случай значения„значение“уже используется» (см the microsoft documentation).

И последнее, но не менее важное: вы смешиваете char и const char *. 'y' - char, а "Y" предоставит вам const char *, указатель на строку C. Вы должны использовать первое для сравнения одиночных символов.

0

во первых, пожалуйста, удалите enter code here на свой вопрос.

О проблеме, C2196:

Оператор коммутатор использует то же значение, случай более чем один раз.

Потому что ('у' || "Y") = ('п' || 'N') = True

Вы на самом деле нужны сделать так:

#include<iostream> 
using namespace std; 
int main() 
{ 
    char response; 
    cout << " Enter your response " << endl; 
    cin >> response; 
    switch (response) 
    { 
    case 'y' : 
    case 'Y': 
     cout << "You chose y or Y " << endl; 
     break; 
    case 'n': 
    case 'N': 
     cout << "You chose n or N " << endl; 
     break; 
    default: 
     cout << "You didn't choose a valid option " << endl; 
     break; 
    } 
    return 0; 
} 
0

В код как

switch(x) { 
case a: 
    ... 
    break; 
case b: 
    ... 
    break; 
} 

потока управления подскакивает только в case a когда x == a. Итак, с case 'Y' || 'y' компилятор действительно оценивает выражение 'Y' || 'y' до true || true, а затем до true. Затем он будет прыгать на эту метку только тогда, когда response == (char)true == (char)1, что никогда не бывает.

switch Операции не могут использоваться для более сложных условий, а также работают только со встроенными значениями (ints, chars). Это позволяет компилятору генерировать более эффективный код, но с современными компиляторами результат, вероятно, всегда будет таким же, как при использовании if/else if.

switch(response) { 
case 'Y': 
case 'y': 
    ... 
    break; 
} 

работает правильно. Поскольку первый case 'Y' не имеет инструкции break, он проваливается и выполняет тот же код, что и case 'y'.

Смежные вопросы