当我不小心写下以下代码时(我在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标签,它会产生编译时错误。
任何帮助将不胜感激,谢谢!
我能够理解这个输出是如何产生的,但是我不明白为什么这不会引起错误,我的意思是我显然没有案例标签(在case2中)对吗?
是的,case2 :
不是案例标签,但它是有效的有效普通标签。任何陈述之前都可以有这样的标签。由于您正在使用GCC,您可以考虑启用-Wall
选项(或特别是-Wunused-label
),在这种情况下,GCC应该警告该标签未使用(因为它不是任何goto
语句的目标)。
如果我将“case2”改为“casex”,我也观察到相同的结果。
嗯,当然。 casex :
也是一个有效的普通标签。
然而,如果我没有放入任何case标签,它会产生编译时错误。
我想你必须意味着你离开冒号,但删除整个标签文本(case2
/ casex
)。这确实会产生无效的代码。但是,如果你删除了整行,那么当然没关系。
你错过了break
所以在每个案例后继续执行(但是有一个!= 1来获得这3个输出)
注意case2:
被视为标签(对于goto)所以不是错误
这里发生的是你得到了默认标签,并且由于你没有休息,你接着是所有其他情况。