开关语句中的 C2196 错误

C2196 error in a switch statement

本文关键字:C2196 错误 语句 开关      更新时间:2023-10-16

我是C++的新手,我正在尝试编写一个代码来评估变量类型字符的用户输入的值,其名称是"响应",使用开关语句处理 2 种情况

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

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

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

请记住,switch()实际上是一个伪装的gotocase标签实际上是goto标签,因此不能对它们进行任何逻辑操作。它还允许您像我展示的那样将案例标签"组合"在一起 - 一旦控制权转移到第一个标签,它就会继续第二个标签,直到它看到break

附带说明一下,您不能像使用大写字母 Y 那样使用双引号来表示单个字符。

switch控制流在其case中查找常量值。看这里。

要完成您尝试执行的操作,您可以使用如下所示的开关盒:

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

case 'y' || "Y"没有达到您的预期。您在此处使用逻辑||,它将始终返回true,对于char类型,它表示1case '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;
}

您的代码存在多个问题。

在每个 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,这意味着"案例值'值'已使用"(请参阅微软文档)。

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

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

关于问题,C2196:

switch 语句多次使用相同的大小写值。

因为("y" ||"Y") = ('n' ||'N') = 真

您实际上需要这样做:

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

在类似

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

控制流仅在x == a时跳入case 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语句,因此它失败并执行与case 'y'相同的代码。