我正在开发一个石头剪刀布程序,但是这次计算机有一半的时间选择石头,三分之一的时间选择剪刀,只有六分之一的时间选择布。我这样做的方法是枚举六个可能的计算机选择值:
enum choicec {rock1, rock2, rock3, scissors1, scissors2, paper};
choicec computer;
但是,在计算机做出选择之后,我必须将这些枚举值转换为石头、布或剪刀。我使用 switch-case 语句做到了这一点:
switch(computer) {
case rock1 || rock2 || rock3:
c = 1;
break;
case scissors1 || scissors2: //ERROR!
c = 3;
break;
case paper:
c = 2;
break;
}
一个是石头,两个是布,三个是剪刀。但是,在我以注释形式写入错误的行上,它给出了以下错误:[错误]重复的大小写值。
我不知道为什么。 有什么想法吗?
我不确定你在做什么,但 switch 语句应该如下所示
switch(computer)
{
case rock1:
case rock2:
case rock3:
c = 1;
break;
case scissors1:
case scissors2:
c = 3;
break;
case paper:
c = 2;
break;
}
您不能在
||
分支中使用 case
。 抱歉:(||
时,它会对它们执行逻辑或,即“rock1
或 rock2
或 rock3
不是零吗?”。 答案是肯定的,其中至少有一个不为零。 所以rock1 || rock2 || rock3
就是true
,也就是1
。 而scissors1 || scissors
也是true
,也就是1
。 因此对于 case
案例,您有两个 1
分支。
您应该简单地使用
case
fallthrough来选择多个条件:
switch(computer) {
case rock1: case rock2: case rock3:
c = 1;
break;
case scissors1: case scissors2:
c = 3;
break;
case paper:
c = 2;
break;
default:
std::cerr << "INVALID COMPUTER MOVE";
}
此外,我的案例开关中始终有一个默认值。 有时会发生错误,我们肯定想知道它是否没有命中任何 case 分支。 我也对缺少
else
语句感到非常偏执,但大约一半的情况下,如果没有 else
也没关系。
那个
switch
的说法并不符合你的想法。
每个
case
定义与 computer
的值相匹配的 one值。将多个值与逻辑或结合起来,给出与单个
case
标签关联的值,当 computer
的值等于这些值中的 any时,not 不会使相应的块被输入,而是当它是等于它们逻辑或组合的结果。确实没有多大意义。
您可以通过以下方式重写您的
switch
陈述,以便更有意义:
switch(computer) {
case rock1: // Is it rock1?
case rock2: // Or perhaps rock2?
case rock3: // Or maybe rock3?
c = 1; // Well, if it's one of the above, do this...
break;
case scissors1: // OK, it wasn't. So is it scissors1?
case scissors2: // Or scissors2?
c = 3; // If it's one of the above, do this...
break;
case paper: // So is it paper?
c = 2;
break;
default: // Always better to be explicit about this
break;
}
更改为:
switch(computer) {
case rock1:
case rock2:
case rock3:
c = 1;
break;
case scissors1:
case scissors2:
c = 3;
break;
case paper:
c = 2;
break;
}
rock1 || rock2 || rock3
和 scissors1 || scissors2
都是计算结果为“true”的表达式,因此存在冲突。
switch 语句中使用的表达式必须是整型(int、char 和 enum)。在 Switch 语句中,所有匹配的 case 都会执行,直到到达break语句,并且两个 case 标签不能具有相同的值。
但是在上面的情况下有逻辑或条件。 首先
case: rock1 || rock2 || rock3:
这将评估为 1,第二个 case scissors1 || scissors2:
也将评估为 1。这会导致错误,如所述 两个 case 标签不能具有相同的值。
这就是编译器抱怨并给出错误的原因:
Compiler Error: duplicate case value
要解决此问题,请转换为
switch(computer) {
case rock1:
case rock2:
case rock3:
c = 1;
break;
case scissors1:
case scissors2: //Now will not give any error here...
c = 3;
break;
case paper:
c = 2;
break;
}
enum choicec {rock1, rock2, rock3, scissors1, scissors2, paper};
choicec computer;
如果 case 后的变量对于两个或多个 switch case 具有相同的值,也会发生此错误。
#define APPLE 0x0A
#define MANGO 0x0B
#define ORANGE 0x0A
switch(variable)
{
case APPLE:
// do something
break;
case MANGO:
// do something
break;
case ORANGE:
// do something
break;
}
这里 APPLE 和 ORANGE 的值重复,所以会报错:
Compiler Error: duplicate case value
要解决此问题,只需使宏值唯一,如下所示:
#define APPLE 0x0A
#define MANGO 0x0B
#define ORANGE 0x0C