开关语句中的 C2196 错误
C2196 error in a switch statement
我是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()
实际上是一个伪装的goto
。 case
标签实际上是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
类型,它表示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;
}
您的代码存在多个问题。
在每个 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,这意味着"案例值'值'已使用"(请参阅微软文档)。
最后但并非最不重要的一点是,您正在混淆char
和const 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'
相同的代码。
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 开关语句中的 C2196 错误
- 错误C2196:大小写值'?已经使用