博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言拾遗(四):分析switch语句机制---上篇
阅读量:5077 次
发布时间:2019-06-12

本文共 1625 字,大约阅读时间需要 5 分钟。

打算用两篇blog分享一下switch语句的机制。

C语言作为底层开发最常用的语言,要理解C语言的运行机制,阅读对应的汇编代码是非常有帮助的。我会在下篇分析一下汇编中的switch。

这次是上篇,就当作一个热身吧,看看你是否已经了解switch语句是怎么执行的。

翠花,上代码。

阅读下面的代码,请问,从语法上看,有多少处错误?

1 #include 
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 case1case2case3xxxdefault randy@ubuntu:~/C_Language/switch$ ./a.out acase2case3xxxdefault randy@ubuntu:~/C_Language/switch$ ./a.out a bcase3xxxdefault randy@ubuntu:~/C_Language/switch$ ./a.out a b ccase 4xxxdefault randy@ubuntu:~/C_Language/switch$ ./a.out a b c ddefault

小结:

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

 

 

 

转载于:https://www.cnblogs.com/RandyXu/archive/2013/04/07/3006394.html

你可能感兴趣的文章
web服务器
查看>>
网卡流量检测.py
查看>>
poj1981 Circle and Points 单位圆覆盖问题
查看>>
POP的Stroke动画
查看>>
SQL语句在查询分析器中可以执行,代码中不能执行
查看>>
yii 1.x 添加 rules 验证url数组
查看>>
html+css 布局篇
查看>>
SQL优化
查看>>
用C语言操纵Mysql
查看>>
轻松学MVC4.0–6 MVC的执行流程
查看>>
redis集群如何清理前缀相同的key
查看>>
Python 集合(Set)、字典(Dictionary)
查看>>
获取元素
查看>>
proxy写监听方法,实现响应式
查看>>
第一阶段冲刺06
查看>>
十个免费的 Web 压力测试工具
查看>>
EOS生产区块:解析插件producer_plugin
查看>>
mysql重置密码
查看>>
jQuery轮 播的封装
查看>>
一天一道算法题--5.30---递归
查看>>