在 switch case 语句中,它表示“重复的 case 值”出现为错误。有谁知道为什么吗?

问题描述 投票:0回答:6

我正在开发一个石头剪刀布程序,但是这次计算机有一半的时间选择石头,三分之一的时间选择剪刀,只有六分之一的时间选择布。我这样做的方法是枚举六个可能的计算机选择值:

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;
    }

一个是石头,两个是布,三个是剪刀。但是,在我以注释形式写入错误的行上,它给出了以下错误:[错误]重复的大小写值。

我不知道为什么。 有什么想法吗?

c++ switch-statement dev-c++
6个回答
10
投票

我不确定你在做什么,但 switch 语句应该如下所示

switch(computer) 
{
    case rock1:
    case rock2:
    case rock3:
        c = 1;
        break;
    case scissors1:
    case scissors2:
        c = 3;
        break;
    case paper:
        c = 2;
        break;
}

9
投票

您不能在

||
分支中使用
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
也没关系。


4
投票

那个

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;
}

3
投票

更改为:

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”的表达式,因此存在冲突。


2
投票

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;
    }

0
投票
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
© www.soinside.com 2019 - 2024. All rights reserved.