我是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;
}
答案 0 :(得分:2)
case
标签不是if
语句。你不能or
他们。相反,您可以使用相同代码的多个案例标签。例如:
case 'y':
case 'Y':
cout << "You chose y or Y " << endl;
break;
请记住,switch()
实际上是伪装的goto
。 case
标签是有效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)。
最后但同样重要的是,您正在混淆char
和const 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
相同的代码。