zoukankan      html  css  js  c++  java
  • C语言之switch语句与if...else..语句的比较及switch语句高效的原因

    1.switch语句与if...else...语句的区别:

    • switch语句只进行等值判断,而if...else可以进行区间判断
    • switch结构的执行效率远远高于if...else。在分支条件比较多的情况下这种趋势愈发明显

    2.switch语句高效的原因

      游戏中的快捷键常用switch语句实现功能

    对比if...else和switch语句:

    (1)一个简单的if...else...语句:

    #include<stdio.h>
    
    void main() {
        int x = 3;
        if (x == 1) {
            printf("x=1");
        }
        else if (x == 2) {
            printf("x=2");
        }
        else if (x == 3) {
            printf("x=3");
        }
        else {
            printf("xxx");
        }
    }

     对应的汇编指令:

      

     大致意思是每次判断,判断如果不符合就下次判断,否则执行对应的代码

    (4)switch语句

    #include<stdio.h>
    
    void main() {
        int x = 3;
        switch (x) {
        case 1:
            printf("x=1");
            break;
        case 2:
            printf("x=2");
            break;
        case 3:
            printf("x=3");
            break;
        default:
            printf("xxx");
        }
    }

     对应的汇编指令:

      

    switch语句会在case开始前进行x的判断,相等了就跳到对应的位置,否则就jmp到default的位置。

    这里看好像与if else 相比并没有什么优势。

    如果把switch语句的判断数加两个:

    #include<stdio.h>
    
    void main() {
        int x = 3;
        switch (x) {
        case 1:
            printf("x=1");
            break;
        case 2:
            printf("x=2");
            break;
        case 3:
            printf("x=3");
            break;
        case 4:
            printf("x=4");
            break;
        case 5:
            printf("x=5");
            break;
        default:
            printf("xxx");
        }
    }

    此时的汇编语句:

      

    条件多的时候就会通过生成一张表,这个表里面存储所有分支的函数地址,一次就可以跳到对应的地址,避免了不停的判断。

  • 相关阅读:
    npm ERR! code EINTEGRITY npm ERR! sha1- 报错解决办法
    create-react-app创建项目报错SyntaxError: Unexpected end of JSON input while parsing near '...ttachment":false,"tar' npm代理
    七大设计原则
    UML类图和时序图
    linux环境下排查cpu占比高的MySQL数据库sql语句
    Angular 2 imooc 学习笔记
    angular JS 学习笔记
    Hibernate HQL基础
    Hibernate注解
    Hibernate多对多映射
  • 原文地址:https://www.cnblogs.com/codexlx/p/13414907.html
Copyright © 2011-2022 走看看