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()
实际上是伪装的 goto
。 case
标签实际上是 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
类型,它表示 1
。 case '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)。
最后但同样重要的是,您混淆了 char
和 const 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'
.
相同的代码
我是 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()
实际上是伪装的 goto
。 case
标签实际上是 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
类型,它表示 1
。 case '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)。
最后但同样重要的是,您混淆了 char
和 const 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'
.