C++嵌套开关重复值错误



所以这是我试图开始工作的代码,但它显示了"重复大小写值";每当它到达B我是一名大学一年级的学生,所以我可能使用了错误的格式,或者我可能忽略了一些我似乎真的不明白问题所在的东西,所以我向你们寻求的帮助


char dep;
int exp;

cout<<"please enter your department, A, B OR C: ";
cin>>dep;

cout<<"please enter your years of experience ";
cin>>exp;

switch(dep)
{

case 'A' || 'a' :{
switch (exp) {
case 5:
cout<<"you will recieve a 5% raise and 2.5% extra due to your experience";
break;
defualt : cout<<"you get 5% raise";
break;
}

}     
break;

case 'B' || 'b' :{
switch (exp) {
case 5:
cout<<"you will recieve a 2% raise and 2.5% extra due to your experience";
break;
defualt : cout<<"you get 2% raise";
break;
}
}
break;

尽管它会编译(或者在没有B版本的情况下会编译(,如果粗略地翻译成英语,它会拼写出你想要的内容,但case 'A' || 'a'并没有做你认为它会做的事情。

case之后的表达式被视为选择语句的精确匹配——它与dep进行精确比较。你不能再加上一个更复杂的表达式,并期望它是";展开的";转换为多重比较。将switch/case视为一个简单的查找表,而不是一个智能分支功能(这就是if的作用!(。

也许令人困惑的是,表达式'A' || 'a'本身是有效的,但(像任何表达式一样(它的求值为单个值:truefalse,这取决于其中一个操作数是否为"if";truthy";。在这个特定的例子中,两者都没有ASCII值零,所以两者都是真的,并且表达式总是true。它将被转换为dep的类型(规则说它变成1(,并用于精确查找。

由于您也使用了'B''b',因此您确实有两个等效的case

相反,为每个条件写一个单独的案例。幸运的是,由于case失败了,您不需要重复";身体;对于这种情况:您可以将两个case放在一起;只是不要在它们之间放一个break

case 'A':
case 'a':
// code here
break;
case 'B':
case 'b':
// code here

顺便说一下,你投错了default