9

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

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

一是石头,二是纸,三是剪刀。但是,在我将错误写为注释的那一行,它给了我这个错误:[Error] duplicate case value。

我不确定为什么。有任何想法吗?

4

5 回答 5

8

你不能||case分支中使用。抱歉 :(
当您使用它时,对它们执行逻辑或||,即“是rock1或不是零?”。答案是肯定的,其中至少有一个不是零。所以是,这是。而且也是, 即. 所以你有两个分支来处理这个案例。rock2rock3rock1 || rock2 || rock3true1scissors1 || scissorstrue1case1

您应该简单地使用casefallthrough 来选择多个条件:

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

另外,我的案例开关总是有一个默认值。有时会发生错误,我们肯定想知道它是否没有触及任何案例分支。我对遗漏else的陈述也很偏执,但大约有一半的时间没有else.

于 2013-06-20T22:42:17.837 回答
8

我不确定你在做什么,但 switch 语句应该是这样的

switch(computer) 
{
    case rock1:
    case rock2:
    case rock3:
        c = 1;
        break;
    case scissors1:
    case scissors2:
        c = 3;
        break;
    case paper:
        c = 2;
        break;
}
于 2013-06-20T22:43:13.177 回答
4

switch声明与您的想法不符。

每一个都case定义了一个computer与之匹配的值。将多个值与逻辑析取组合以给出与单个case标签关联的值不会computer在 的值等于任何这些值时输入相应的块,而是当它等于它们的逻辑 OR 组合的结果时。不是很有意义,确实。

这就是您可以如何重写您的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;
}
于 2013-06-20T22:41:46.463 回答
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都是评估为“真”的表达式,因此存在冲突。

于 2013-06-20T22:41:50.847 回答
2

switch 语句中使用的表达式必须是整型(int、char 和 enum)。在 Switch 语句中,所有匹配的 case 都会执行,直到到达 break 语句并且两个 case 标签不能具有相同的值。

但在上述情况下,具有逻辑或条件。首先 case: rock1 || rock2 || rock3: ,这将评估为 1,第二个case scissors1 || scissors2:也将评估为 1。这是导致错误,因为所述两个案例标签不能具有相同的值。

这就是编译器抱怨并给出错误的原因:

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;
    }
于 2019-06-12T17:48:47.157 回答