在 switch case 语句中,它说“重复的 case 值”作为错误出现。为啥?

Posted

技术标签:

【中文标题】在 switch case 语句中,它说“重复的 case 值”作为错误出现。为啥?【英文标题】:In a switch case statement, it says "duplicate case value" comes up as an error. Anyone know why?在 switch case 语句中,它说“重复的 case 值”作为错误出现。有谁知道为什么? 【发布时间】:2013-06-20 22:39:27 【问题描述】:

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

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。

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

【问题讨论】:

rock1 || rock2 || rock3 计算结果为真 (1),如 scissors1 || scissors2。您需要单独的标签,但可以使用直通标签,case rock1: case rock2: case rock3: c = 1; break; 您不能在case 语句中使用||。对不起:( 选择像 rock, scissors, paper 这样的枚举,然后简单地构建随机数生成器以提供必要的统计百分位数不是更好的设计吗? 谢谢大家!这真的很有帮助。现在程序可以运行了。 【参考方案1】:

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

switch(computer) 

    case rock1:
    case rock2:
    case rock3:
        c = 1;
        break;
    case scissors1:
    case scissors2:
        c = 3;
        break;
    case paper:
        c = 2;
        break;

【讨论】:

【参考方案2】:

您不能在case 分支中使用||。对不起:( 当您使用|| 时,它会在它们上执行逻辑或,即“是rock1rock2rock3 不是零吗?”。答案是肯定的,至少其中一个不为零。所以rock1 || rock2 || rock3true,也就是1。而scissors1 || scissors 也是true,也就是1。因此,1 案例有两个 case 分支。

您应该简单地使用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 是可以的。

【讨论】:

【参考方案3】:

switch 声明并不符合您的想法。

每个case 定义一个 值,computer 的值与之匹配。当computer 的值等于any 这些值,而是当它等于它们的逻辑 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;

【讨论】:

【参考方案4】:

改成:

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 || rock3scissors1 || scissors2 都是计算结果为“true”的表达式,因此存在冲突。

【讨论】:

【参考方案5】:

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;
    

【讨论】:

以上是关于在 switch case 语句中,它说“重复的 case 值”作为错误出现。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

Java中为啥我写switch语句,在case后加break就错误,不加就正确,很困惑,

C语言中的Switch-case语句

switch case的用法

C语言 回滚技术 switch case

写switch case语句不加break会怎样

C语言的switch语句中case后()