拥有一个没有值的switch语句case标签

问题描述 投票:2回答:3

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

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

我得到的输出是:

默认

我能够理解这个输出是如何产生的,但是我不明白为什么这不会引起错误,我的意思是我显然没有案例标签(在case2中)对吗?如果我将“case2”改为“casex”,我也观察到相同的结果。然而,如果我没有放入任何case标签,它会产生编译时错误。

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

c switch-statement
3个回答
4
投票

我能够理解这个输出是如何产生的,但是我不明白为什么这不会引起错误,我的意思是我显然没有案例标签(在case2中)对吗?

是的,case2 :不是案例标签,但它是有效的有效普通标签。任何陈述之前都可以有这样的标签。由于您正在使用GCC,您可以考虑启用-Wall选项(或特别是-Wunused-label),在这种情况下,GCC应该警告该标签未使用(因为它不是任何goto语句的目标)。

如果我将“case2”改为“casex”,我也观察到相同的结果。

嗯,当然。 casex :也是一个有效的普通标签。

然而,如果我没有放入任何case标签,它会产生编译时错误。

我想你必须意味着你离开冒号,但删除整个标签文本(case2 / casex)。这确实会产生无效的代码。但是,如果你删除了整行,那么当然没关系。


2
投票

你错过了break所以在每个案例后继续执行(但是有一个!= 1来获得这3个输出)

注意case2:被视为标签(对于goto)所以不是错误


-1
投票

这里发生的是你得到了默认标签,并且由于你没有休息,你接着是所有其他情况。

© www.soinside.com 2019 - 2024. All rights reserved.