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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中为啥我写switch语句,在case后加break就错误,不加就正确,很困惑,相关的知识,希望对你有一定的参考价值。

Java中为什么我写switch语句,在case后加break就错误,不加就正确,很困惑,难道加不加也有讨教?

在 switch 语句中使用break语句将终止语句的序列。当遇到 Break语句时,程序将整个 switch 语句后面的一行代码处开始执行,就有一种跳出switch 语句的效果。

break 语句是可选的,如果省略掉break 语句程序将执行下一条 case ,如果你需要使用多条 case ,你可以不用没有 break 语句。

switch 语句的使用在多选择的时候要比 if else 执行效率要高。

switch的工作原理,一旦发现匹配,就一直执行,不在判断。

int A=2
switch(A)

case 1:printf("1");
case 2:printf("2");
case 3:printf("3");
case 4:printf("4");
default;

如若不加break,switch发现2匹配,首先执行
printf("2");
然后再不判断,
printf("3");
printf("4");
也执行了。这应该不是你的本意吧。所以最好每个case后面都加break。

switch起到的作用类似于跳转,满足switch的条件会跳转到对应的case下执行代码。

如果不加break,代码会从那开始执行,一直执行到最后,所以不符合case的语句也会被执行。

一个标准的switch、case写法如下:

switch(conditions)

    case ...:
     doSomething();
     break;
    case ...:
     doAnotherThing();
     break;
    default:
     defaultThing();

参考技术A 你的代码逻辑顺序有问题 参考技术B 代码贴一下,理论上没有关系啊,是不是你写法有问题,贴代码

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

【中文标题】在 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;
    

【讨论】:

以上是关于Java中为啥我写switch语句,在case后加break就错误,不加就正确,很困惑,的主要内容,如果未能解决你的问题,请参考以下文章

switch 语句中当执行完一个case后还能执行另一个case么

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

为啥 switch 语句上有奇怪的缩进?

这个PHP流程判断switch语句哪里出错了?为啥不执行default后面的语句

为啥我在switch-case语句下嵌套if-else语句会报错?怎么改?

c语言case