10行C语言代码却搞了我一个通宵!写了5年代码我居然还没搞懂switch语句!
test.c
int main(){int a = 1;// a > 1 ??/a++;if (a > 1){printf("a > 1\n");}else{printf("a <= 1\n");}return 0;}
gcc test.c -o test
gcc test.c -o test -trigraphs
什么?结果怎么会是 a <= 1
再来看一个问题!
test.c
int calculator(int x, int y, char opt){switch(opt){case '+':return x + y;case '-':return x - y;case '*':return x * y;defualt:return x / y;}}int main(){int a = 2, b = 1;printf("%d\n", calculator(a, b, '/'));return 0;}
编译:
gcc test.c -o test
运行:
2 / 1 等于 47 是什么鬼!
当然这两个代码都是我从项目中单独拿出来写的demo,如果把它们放在一大堆代码中,又得搞个通宵了。
我们都知道C语言里面有很多转义符号,例如:
\n 换行符(LF)\r 回车符(CR)\t 水平制表符(HT)\b 退格符(BS)\’ 单引号\” 双引号\\ 反斜杠
当然还有很多,我就不一一列举了。这些符号在代码中都有特别的作用,或者无法直接输入,因此用转移符+其他字符组合来代替。
同样的,早期的一些键盘可能没法输入一些特殊的符号,如:
# $ @ [ \ ] ^ ` { | } ~
于是,为了解决这个问题C语言标准规定预处理器(C preprocessor)在扫描处理C语言源文件时,替换下述的3字符出现为1个字符:
??= 替换为 #??/ 替换为 \??` 替换为 ^??( 替换为 [??) 替换为)??! 替换为|??< 替换为{??> 替换为}??- 替换为~
也就是说,“??/”会被替换为“\”!
首先,case 和 default 都是C语言的关键字。
无论把 default 写成什么,都能编译成功。
只是程序执行的时候,不会进入这个分支!
编译器把错写的标识当成了标签,因为一行中冒号之前都被当作标签。
它可以是任意标识。
所以,default误写不会导致编译错误,但是却导致了执行错误。
又是一个心力憔悴的夜晚。不说了,赶紧睡觉!
