switch 语句中的 C2196 错误

C2196 error in a switch statement

我是 C++ 的新手,我正在尝试编写代码来评估用户输入的变量类型 char 的值,它的名称是 "response" 使用 switch 语句将适用于 2 种情况

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

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

但是我的代码遇到了一个问题,它生成了 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 标签,因此您不能对它们进行任何逻辑操作。它还允许您像我展示的那样将 'combine' 大小写标签放在一起 - 一旦控制权转移到第一个标签,它就会继续通过第二个标签,直到它看到 break.

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

a switch 控制流在其 case 中寻找常量值。 参见 here

要完成您想要做的事情,您可以使用这样的 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" 没有达到您的预期。您在这里使用的是逻辑 ||,它总是 return true,对于 char 类型,它表示 1case 'n' || 'N'也是一样,所以你确实在这里写了两个case 1:,这就是你收到错误信息的原因:

error C2196: case value '1' already used

你可能想要

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

测试具有相同效果的不同值。

另外,你实际测试的是if response == true。在布尔表达式中,非 0 的所有内容都被视为 true,因此 'y'"Y" 都是 true 并且 'y'||"Y" 被评估为 [=14= 】 还有。 '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,这意味着 "case value 'value' already used"(请参阅 the microsoft documentation)。

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

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

关于问题,C2196:

A switch statement uses the same case value more than once.

因为 ('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;
}   

像这样的代码

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'.

相同的代码