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

  • 相关阅读:
    Dot Net WinForm 控件开发 (七) 为属性提下拉式属性编辑器
    WinForm 程序的界面多语言切换
    c#遍历HashTable
    Dot Net WinForm 控件开发 (三) 自定义类型的属性需要自定义类型转换器
    Dot Net WinForm 控件开发 (六) 为属性提供弹出式编辑对话框
    Dot Net WinForm 控件开发 (一) 写一个最简单的控件
    Dot Net WinForm 控件开发 (四) 设置属性的默认值
    Dot Net WinForm 控件开发 (二) 给控件来点描述信息
    Dot Net WinForm 控件开发 (八) 调试控件的设计时行为
    Dot Net WinForm 控件开发 (五) 复杂属性的子属性
  • 原文地址:https://www.cnblogs.com/RandyXu/p/3006394.html
Copyright © 2011-2022 走看看