我还没有找到答案,为啥在 switch case 中 continue 会影响 switch 外部的循环,但 break 不会“破坏”循环?

Posted

技术标签:

【中文标题】我还没有找到答案,为啥在 switch case 中 continue 会影响 switch 外部的循环,但 break 不会“破坏”循环?【英文标题】:I haven't found the answer to this, why continue in switch case affects the loop outside the switch but break doesn't "break" the loop?我还没有找到答案,为什么在 switch case 中 continue 会影响 switch 外部的循环,但 break 不会“破坏”循环? 【发布时间】:2020-04-23 15:17:40 【问题描述】:

代码如下:

#include <stdio.h>

int main ()

    int menu=0;
    while (menu!=3)
    
        scanf ("%d", &menu);
        switch (menu)
        
            case 1:
            
                printf ("Case 1\n");
                continue;
            

            case 2:
            
                printf ("Case 2\n");
                break;
            
        
        printf ("This doesn't get printed by case 1\n");
    

    return 0;

每次我把它设置为 1 时,printf 都不会出现,但除此之外,它运行良好。那么continuebreak 如何在loop 中为switch 工作?为什么break 不会打破循环?相反,它阻止了下一个案例的正确处理?但是continue 呢?需要明确的是,我实际上是在问它有什么不同以及它们实际上是如何工作的。注意:我在 java 中也做过这个(用 eclipse)。

【问题讨论】:

因为开关中的break有特定的含义(结束当前的情况),而continue没有(所以它的意思就好像它在开关之外一样)。跨度> 这能回答你的问题吗? Java How can I break a while loop under a switch statement? @Savior 不幸的是,不,我认为这与我询问用法的问题不同,为什么不同,原因正如我在这篇文章的正文中所说的那样。 @AndyTurner 所以你的意思是,破案是一种特殊的事情,就像“破案并走出开关”,而继续没有,所以它只会影响循环平时继续吗? 如果你不在 switch 中使用break,它会进入下一个 case 标签。我们使用break来退出整个switch语句。 【参考方案1】:

B(以及其后的后代,包括 C++、Java 或 javascript)重载 break 关键字以跳出 @9​​87654323@es。

因此,当您处于嵌套循环/switch 的情况下,break 关键字将应用于最内层的switch 或循环,以更接近者为准。

这种超载是历史的偶然。 B 从复制 BCPL 开始,而 BCPL 后来获得了一个 endcase 关键字设计,专门用于破坏 switches,Thompson 和 Ritchie 并没有意识到这一变化,因此 B 和 C 继续使用他们自制的 break 重新改编为这个目的。

( http://port70.net/~nsz/c/c89/dmr_the_development_of_the_c_language.pdf

并非所有 BCPL 语言之间的差异都记录在 理查兹的书 [Richards79] 和 B 是经过深思熟虑的;我们从一个 早期版本的 BCPL [Richards 67]。例如,结束情况 语言中不存在从 BCPL switchon 语句的转义 当我们在 1960 年代学习它时,因此休息的超载 关键字从 B 和 C switch 语句中转义归咎于发散 进化而不是有意识的改变。

)

在任何情况下,在 B/C/C++ 中,break/continue 只不过是 goto 的语法糖,如果你想 break/continue 不是最内层循环/ switch,您始终可以通过使用显式 goto 来实现它:

#include <stdio.h>

int main ()

    int menu=0;
    while (menu!=3)
    
        scanf ("%d", &menu);
        switch (menu)
        
            case 1:
            
                printf ("Case 1\n");
                continue;
            

            case 2:
            
                printf ("Case 2\n");
                goto break_loop;
                //`return 0;` would work too in this case
                break; //would break out of the switch

            
        
        printf ("This doesn't get printed by case 1\n");
    
break_loop:
    return 0;

【讨论】:

【参考方案2】:

continue具体表示跳过当前循环中的处理,开始循环的下一次迭代(假设循环运行的条件仍然成立)。

在您的代码中只有一个循环。

【讨论】:

所以,break 在某种情况下被“编程”以打破switch,而不是循环,对吗?虽然continue 像往常一样继续? @LastSecond959 continueswitch 中没有任何内容,因为switchs 不会循环。或者从另一个角度来看,您可以将循环中的continue 视为goto right_before_the_closing_right_brace;,将break 视为goto right_after_the_closing_brace,但在switch 中,这两者具有相同的效果并强制continue也适用于switches 只会降低语言的表现力。

以上是关于我还没有找到答案,为啥在 switch case 中 continue 会影响 switch 外部的循环,但 break 不会“破坏”循环?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

switch结构case语句后的多个语句必须放在花括号中。 这句话对吗?为啥?

JavaScript Switch语句 - 单个案例中的同义词

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

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