zoukankan      html  css  js  c++  java
  • 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---

  • 相关阅读:
    NSIS 2.0界面快速入门
    [反汇编练习] 160个CrackMe之016
    [反汇编练习] 160个CrackMe之015
    [反汇编练习] 160个CrackMe之014
    [反汇编练习] 160个CrackMe之013
    Ubuntu 安装之python开发
    git 技能图
    linux 系统 权限
    Git 常用命令
    python 之virtualenv和virtualenvwrapper使用
  • 原文地址:https://www.cnblogs.com/RandyXu/p/3006394.html
Copyright © 2011-2022 走看看