今天程序出现了一个问题,调试了很长时间,最终发现是因为C语言中default关键字写错了导致的。
简写的程序如下。
// t.c
#inclue <stdio.h>
void main()
{
int a = 11;
printf( "a is %d\n", a );
switch (a)
{
case 1:
printf( "a is 1\n" );
return;
defualt: // 应该是default
printf( "a isn't 1\n" );
return;
}
printf( "What is a ?\n" );
return;
}
编译执行。
gcc t.c
./a.out
a is 1
What is a ?
把 defualt 改为 default,输出如下。
./a.out
a is 1
a isn't 1
实验:无论把 default 写成什么(例如 abcdef),都能编译成功,但执行时不会进入那个分支。
原因: 编译器把错写的标识当成了label,因为一行中冒号之前的标识看做label,它可以是任意标识。所以,default误写不会导致编译错误,但是却导致了执行错误。这个错误不容易发现。