c语言switch语句的机制,C语言拾遗(四):分析switch语句机制

本文探讨了C语言中switch语句的工作原理,通过实例展示了case标签后的宏定义使用、fallthrough现象以及标签的灵活性。在不同情况下的执行结果揭示了break语句的作用和默认分支的位置自由性。下篇将通过汇编分析进一步解释switch的底层机制。
摘要由CSDN通过智能技术生成

打算用两篇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 caseTWO: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 gotoxxx;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---

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值