C语言拾遗(四):分析switch语句机制---上篇
打算用两篇blog分享一下switch语句的机制。
C语言作为底层开发最常用的语言,要理解C语言的运行机制,阅读对应的汇编代码是非常有帮助的。我会在下篇分析一下汇编中的switch。
这次是上篇,就当作一个热身吧,看看你是否已经了解switch语句是怎么执行的。
翠花,上代码。
阅读下面的代码,请问,从语法上看,有多少处错误?
1 #include <stdio.h> 2 #define TWO 2 3 4 int main(int argc, char ** argv) 5 { 6 switch(argc) { 7 case 1: 8 printf("case 1\n"); 9 case TWO: 10 printf("case 2\n"); 11 case 3: 12 printf("case3\n"); 13 xxx: 14 printf("xxx\n"); 15 default: 16 printf("default\n"); 17 break; 18 case 4: 19 printf("case 4\n"); 20 goto xxx; 21 } 22 return 0; 23 }
好了看完了,是不是有以下的疑惑?
TWO是宏定义,可以写在case后面吗?有的地方为什么没有break?有没有关系?xxx是什么东西?default不是应该放在最后吗?
如果你对这些疑惑都有很清楚的答案,那么你会回答,这段代码从语法上来讲,错误个数是0. 是的,没有错误。
我们可以编译并成功生成a.out
看一下运行的结果。
randy@ubuntu:~/C_Language/switch$ ./a.out case1 case2 case3 xxx default
randy@ubuntu:~/C_Language/switch$ ./a.out a case2 case3 xxx default
randy@ubuntu:~/C_Language/switch$ ./a.out a b case3 xxx default
randy@ubuntu:~/C_Language/switch$ ./a.out a b c case 4 xxx default
randy@ubuntu:~/C_Language/switch$ ./a.out a b c d default
小结:
1.语法,"case 常量表达式: 语句序列”,宏定义的TWO经过预编译被替换成2.
2.switch不会在每个case标签后面的语句执行完毕后自动终止。一旦执行某个case语句,程序将会一次执行后面所有的case,除非遇到break语句。
这被称之为“fall through”。
3.switch内部的任何语句都可以加上标签,所有的case都是可选的,任何形式的语句,包括带标签的语句都是允许的(xxx)。
4.break中断了什么?break语句事实上跳出的是最近的那层循环语句或switch语句。
5.各个case和default顺序可以是任意的,如果没有default,而且每个case选项都不符合,则相当于switch语句没有执行。
OK,依据小结内容,参照每次执行结果,都明白了吧?有任何意见或问题,欢迎在评论中提出一起讨论。
至于想要再深入理解为什么switch语句会有这样的特性,下篇汇编分析见。
---End---