今天遇到一个奇怪的问题:
一个 C 语言初学者写了这样的错误代码:
switch (a)
{
case1:
// do something
break;
case2:
// do something
break;
case3:
// do something
break;
default:
break;
}
错误很容易解决,但是,在编译这样的程序时,编译器居然没有报错??!!
那么 case1
case2
这些东西是哪里来的?
几番求证无果,最后在翻阅《C 专家编程》这本书的时候突然发现了原因:
首先像下面这样写是可以的:
switch (i)
{
case 5 + 3: do_again:
case 2: printf("I loop unremittingly\n"); goto do_again;
default: i++;
case 3: ;
}
这里定义了一个标签 do_again
,并且通过 goto
跳转。
原错误代码中 case1
case2
等被编译器理解为了标签。
由于 goto
不被建议使用,博主居然已经忘记了标签和 goto
的用法。
不管怎么说,问题解决了。
这不是 Bug,而是 C 语言的特性。 #(滑稽)
类似地,有如下代码:
#include <stdio.h>
int main() {
https://aimerneige.com
printf("Hello World!\n");
return 0;
}
这里的代码直接贴上了一个 url,但是编译器也没有报错,是因为 https
被识别为标签,而后面的内容被识别为注释。