切换语句

时间:2016-01-29 15:59:43

标签: c++ compiler-errors switch-statement

我是C ++中的新手,我正在尝试编写一个代码来评估变量类型字符的用户输入的值,并且使用可以处理2种情况的switch语句将其名称称为“response”

案例1:如果响应是y(小写)或Y(大写),它将打印控制台窗口的消息

案例2:如果响应是n(小写)或N(大写),它将向控制台窗口打印另一条消息

但我遇到了我的代码生成C2196错误的问题,我在msdn上搜索了它,我明白这是什么意思但是却无法解决这个错误

#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;
}   

6 个答案:

答案 0 :(得分:2)

case标签不是if语句。你不能or他们。相反,您可以使用相同代码的多个案例标签。例如:

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

请记住,switch()实际上是伪装的gotocase标签是有效goto标签,因此您无法对其进行任何逻辑操作。它还允许您组合&#39;案例标签就像我已经显示的那样 - 一旦控件转移到第一个标签,它就会持续到第二个标签,直到它看到break

在旁注中,您不能像使用大写Y一样使用双引号来表示单个字符。

答案 1 :(得分:0)

switch控制流在其case s中查找常量值。 请参阅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;
}   

答案 2 :(得分:0)

case 'y' || "Y"没有达到您的预期。您在此处使用逻辑||,它始终会返回true,而char类型则表示1。对于case 'n' || 'N'它也是一样的,所以你确实在这里写了两个case 1:,这就是你收到错误信息的原因:

  

错误C2196:案例值&#39; 1&#39;已经使用过了

你可能想要

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;
}

答案 3 :(得分: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)。

最后但同样重要的是,您正在混淆charconst char *'y'char,而"Y"会给你一个const char *,一个指向C字符串的指针。您应该使用前者来比较单个字符。

答案 4 :(得分:0)

首先,请删除问题中的enter code here

关于这个问题,C2196:

  

switch语句多次使用相同的case值。

因为('y'||“Y”)=('n'||'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;
}   

答案 5 :(得分:0)

在像

这样的代码中
jQuery("#result").on("click","'.returnName" function(e)
{
     var choosenName = $(this).html();    
     var choosenId = $(this).data('id');
     $('#search_keyword_id').val(choosenName );
     $('#resID').val(choosenId );
});

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 / if时的结果相同。

else if

正确地工作。由于第一个switch(response) { case 'Y': case 'y': ... break; } 没有case 'Y'语句,因此它会落实并执行与break相同的代码。