当我不小心编写以下代码(在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”,我也会观察到相同的结果。 而如果我不使用任何标签,则会出现编译时错误。
任何帮助将不胜感激,谢谢!
答案 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)
这里发生的事情是您使用了默认标签,并且由于您没有间断,因此您继续进行其他所有情况。