有一个没有值的switch语句案例标签

时间:2019-04-21 17:29:58

标签: c switch-statement

当我不小心编写以下代码(在C中的gcc上)时,我正在处理Switch语句

        int a = 2;
        switch(a)
        {
                default:
                        printf("Default\n");
                case 1:
                        printf("One\n");          
                case2 :
                        printf("Two\n");
        }

我得到的输出是:

默认

一个

两个

我能够理解此输出是如何产生的,但是我不明白为什么这不会引发错误,我的意思是我显然没有case标签(在case2中),对吗?另外,如果我将“ case2”正确设置为“ casex”,我也会观察到相同的结果。 而如果我不使用任何标签,则会出现编译时错误。

任何帮助将不胜感激,谢谢!

3 个答案:

答案 0 :(得分:4)

  

我能够理解此输出是如何产生的,但是我不知道   了解为什么这不会引发错误,我的意思是我显然不   有一个案例标签(case2)对吗?

是的,case2 :不是 case 标签,而是有效的普通标签。任何声明之前都可以带有这样的标签。由于您使用的是GCC,因此可以考虑启用-Wall选项(或特别是-Wunused-label),在这种情况下,GCC应警告该标签未使用(因为它不是任何{ {1}}语句。

  

我也观察到了同样的情况   例如,如果我将“ case2”正确设置为“ casex”,则返回结果。

好的,当然。 goto也是有效的普通标签。

  

如果我不这样做   放在任何情况下的标签都会给出编译时错误。

我想您必须表示离开冒号,但删除整个标签文本(casex : / case2)。那确实会产生无效的代码。但是,如果您删除了整行,那当然可以。

答案 1 :(得分:2)

您错过了break,因此在每种情况下都继续执行(但!= 1时才有这3个输出)

注释case2:被视为标签(用于 goto ),因此不是错误

答案 2 :(得分:-1)

这里发生的事情是您使用了默认标签,并且由于您没有间断,因此您继续进行其他所有情况。