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---

 

 

 

posted on 2013-04-07 22:33  Randy Xu  阅读(1819)  评论(3编辑  收藏  举报

导航