今天遇到一个奇怪的问题:
一个 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 被识别为标签,而后面的内容被识别为注释。