switch...case 没有break问题

    技术2022-07-10  171

    最近笔试总是遇到switch...case没有匹配break的题型,在这里做一个总结。

    ps:平时编码中,一定要注意编码规范,每个case都写好对应的break,不要学习这种骚操作,稍不注意就可能出现bug!

     

    switch...case的三个规则:

    (1)既无成功匹配,又无default子句,那么swtich语句块什么也不做;

    (2)无成功匹配,但有default,那么swtich语句块做default语句块的事;

    (3)有成功匹配,没有break,那么成功匹配后,一直执行,直到遇到break。

    通俗一点说,就是:

    我只找我想要的case,其他的都不管(直接注释掉这个case前面的所有语句)。

    找到我想要的case后,我就不再看其他case了(直接注释掉这个case后面的其他"case"关键字)。

    找到我想要的case后,我只管执行后面代码,直到遇到break后跳出switch语句块。

     

    例1:无成功匹配,无default

    #include<stdio.h> int main() { int n = 5; switch (n){ case 1: printf("1"); break; case 2: printf("2"); case 3: printf("3"); } }

    输出结果:空

    思路:有没有成功匹配(“case 5”)?没有。

    再看看有没有default?没有。

    直接退出switch语句块,所以输出为空。

     

    例2  有成功匹配

    int main() { int n = 5; switch (n){ case 1: printf("2"); case 2: printf("3"); case 5: printf("5"); } }

    输出结果:5

    思路:有没有成功匹配(“case 5”)?有。

    那么直接跳到case 5,然后执行printf("5");

    语句块结束,最终输出为:5

     

     

    例3  有成功匹配,无break

    #include<stdio.h> int main() { int n = 5; switch (n){ case 1: printf("1"); case 2: printf("2"); case 5: printf("3"); case 3: printf("4"); break; case 7: printf("6"); } }

    输出结果:34

    思路:有没有成功匹配(“case 5”)?有。

    那么直接跳到case 5,然后执行printf("3");

    由于已经成功匹配“case 5”,所以“case 3:”这行代码直接注释,执行printf("4");

    遇到break,跳出switch语句块,执行结束。

     

    例4:无成功匹配,有default,无break

    #include<stdio.h> int main() { int n = 5; switch (n){ default: printf("1"); case 2: printf("2"); case 3: printf("3"); } }

    输出结果:123

    步骤:有没有成功匹配(“case 5”)?没有。

    再看看有没有default?有。

    有default,那么执行default后面的语句,执行printf("1");

    由于已经匹配“default”,所以“case 2:”这行代码直接注释,执行printf("2");

    由于已经匹配“default”,所以“case 3:”这行代码直接注释,执行printf("3");

    所以,最后的输出结果为:123

     

     

    Processed: 0.116, SQL: 9