分支语句和循环语句,为什么switch效率比if高?

目录

分支语句

switch与if..else效率分析

循环语句


分支语句

1、if语句分析

            if语句用于根据条件选择执行语句

            else不能独立存在且总是与它最近的if相匹配

            else语句后可以连接其它if语句

            if语句中零值比较的注意点

                  - bool型变量应该直接出现于条件中,不要进行比较

                  - 变量和0值比较时,0值应该出现在比较符号左边(better)

                  - float型变量不能直接进行0值比较,需要定义精度

分支语句和循环语句,为什么switch效率比if高?_第1张图片

 

bool b = true;  

if( condition )  
{  
    //statement 1  
}  
else  
{  
    //statement 2  
}  
int i = 1;  

if( 0 == i)  
{  
    //statement 1  
}  
else  
{  
    //statement 2  
}  
#define EPSINON 0.00000001   
  
float f = 0.0;   
  
if((-EPSINON <= f) && (f <= EPSINON))  
{  
    //statement 1  
}  
else  
{  
    //statement 2  
} 

 

2、switch语句分析

            switch语句对应单个条件多个分值的情况

            case语句分支必须要有break,否则会导致分支重叠

            default语句必须加上,以处理特殊情况(太多例子表明这是个好习惯)

分支语句和循环语句,为什么switch效率比if高?_第2张图片

switch(expression)  //表达式结果不能为浮点数
{  
    case CONST_1:  
        //code block  
        break;  
    case CONST_2:  
        //code block  
        break;  
    default:  
        //code block  
} 

   case语句中的值只能是整形或字符型

              case语句的排列顺序

                      - 按字母或数字顺序排列各条语句

                      - 正常情况放在前面,异常情况放在后面

                      - default语句只用于处理真正的默认情况

 

3、实例分析

if和switch使用示例    6-1.c

#include   
  
void f1(int i)  
{  
    if( i < 6 )  
    {  
        printf("Failed!\n");  
    }  
    else if( (6 <= i) && (i <= 8) )  
    {  
        printf("Good!\n");  
    }  
    else  
    {  
        printf("Perfect!\n");  
    }  
}  
  
void f2(char i)  
{  
    switch(i)  
    {  
        case 'c':  
            printf("Compile\n");  
            break;  
          
        case 'd':  
            printf("Debug\n");  
            break;  
          
        case 'o':  
            printf("Object\n");  
            break;  
              
        case 'r':  
            printf("Run\n");  
            break;  
          
        default:  
            printf("Unknown\n");  
            break;  
              
    }  
}  
  
int main()  
{  
    f1(5);  
    f1(9);  
    f1(7);  
      
    f2('o');  
    f2('d');  
    f2('e');  
  
    return 0;  
}  

 

分支语句和循环语句,为什么switch效率比if高?_第3张图片

4、编程实验

有趣的角色对换    6-2.c

#include   
  
void f1(int i)  
{  
    switch( i < 6 )  
    {  
        case 1:  
            printf("Failed!\n");  
            break;  
          
        default:  
            switch( (6 <= i) && (i <= 8) )  
            {  
                case 1:  
                    printf("Good!\n");  
                    break;  
                      
                default:  
                    printf("Perfect!\n");  
                    break;  
            }  
            break;  
    }  
}  
  
void f2(char i)  
{  
    if( 'c' == i )  
    {  
        printf("Compile\n");  
    }  
    else if( 'd' == i )  
    {  
        printf("Debug\n");  
    }  
    else if( 'o' == i )  
    {  
        printf("Object\n");  
    }  
    else if( 'r' == i )  
    {  
        printf("Run\n");  
    }  
    else  
    {  
        printf("Unknown\n");  
    }  
}  
  
int main()  
{  
    f1(5);  
    f1(9);  
    f1(7);  
      
    f2('o');  
    f2('d');  
    f2('e');  
  
    return 0;  
}  

分支语句和循环语句,为什么switch效率比if高?_第4张图片

5、小结

            if语句适用于复杂逻辑进行判断的情形中

            switch语句适用于对离散值进行判断的情形中

            if语句和switch语句在功能上可以互相替换

            if语句对于“按片”分支判断的情形更加简洁

            switch语句对于多分支判断的情形更加简洁

 

switch与if..else效率分析

在分支条件比较多时,switch结构的执行效率远远高于if..else

①当分支条件较少时switch与if..else效率差不多

if..else分析

分支语句和循环语句,为什么switch效率比if高?_第5张图片

           所以可能性最大的选项可以放在if结构的最顶端

switch分析

分支语句和循环语句,为什么switch效率比if高?_第6张图片

分支语句和循环语句,为什么switch效率比if高?_第7张图片

②当条件较多时,switch如何做?!!!

分支语句和循环语句,为什么switch效率比if高?_第8张图片

分支语句和循环语句,为什么switch效率比if高?_第9张图片

当条件很少时不会生成这张表,当条件多时编译器会生成一个算法,带入参数,不需要反复比较即可正确跳转,以空间换时间。

当case后面值很大时,算法中的sub ecx, 1中的1会被其中替换成小的值,如case 100,101,102,103 就是sub ecx, 64h

当case1,2,3,5时,输入4,也会正确跳转到default

....

 

循环语句

1、循环语句分析

循环语句的基本工作方式

      - 通过条件表达式判断是否执行循环体

      - 条件表达式循环if语句表达式的原则

do、while、for的区别

      - do语句先执行后判断,循环体至少循环一次

      - while语句先判断后执行,循环体可能不执行

      - for语句先判断后执行,相比while更简洁

这里不分析goto语句

2、while、for、do...while循环回顾

while(condition)
{
    //loop
}
for(i=0; condition; i++)
{
    //loop
}
do
{
    //loop
}while(condition);

 

3、编程实验

三种循环语句使用对比    7-1.c

#include   
  
int f1(int n)  
{  
    int ret = 0;  
      
    if( n > 0 )  
    {  
        do  
        {  
            ret += n;  
            n--;  
        }  
        while( n > 0 );  
    }  
      
    return ret;  
}  
  
int f2(int n)  
{  
    int ret = 0;  
      
    while( n > 0 )  
    {  
        ret += n;  
        n--;  
    }  
      
    return ret;  
}  
  
int f3(int n)  
{  
    int ret = 0;  
    int i = 0;  
      
    for(i=1; i<=n; i++)  
    {  
        ret += i;  
    }  
      
    return ret;  
}  
  
int main()  
{  
    printf("%d\n", f1(100));  
    printf("%d\n", f2(100));  
    printf("%d\n", f3(100));  
      
    return 0;  
}  

 

 

 

4、循环语句分析

break和continue的区别

           - break表示终止循环的执行

           - continue表示终止本次循环,进入下一次循环

思考:switch能否用continue关键字?为什么?

 

5、实例分析

continue和break的区别    7-2.c

#include   
  
void f1(int n)  
{  
    int i = 0;  
      
    for(i=1; i<=n; i++)  
    {  
        if( (i % 2) == 0 )  
        {  
            break;  
        }  
          
        printf("%d ", i);  
    }  
      
    printf("\n");  
}  
  
void f2(int n)  
{  
    int i = 0;  
      
    for(i=1; i<=n; i++)  
    {  
        if( (i % 2) == 0 )  
        {  
            continue;  
        }  
          
        printf("%d ", i);  
    }  
      
    printf("\n");  
}  
  
int main()  
{  
    f1(10);  
    f2(10);  
      
    return 0;  
}  

 

 

6、do和break的妙用    7-3.c

#include   
#include   
  
int func(int n)  
{  
    int i = 0;  
    int ret = 0;  
    int* p = (int*)malloc(sizeof(int) * n);  
      
    do  
    {  
        if( NULL == p ) break;  
          
        if( n < 5 ) break;  //若直接return ret 会造成内存泄漏
  
        if( n > 100) break;  
          
        for(i=0; i

分支语句和循环语句,为什么switch效率比if高?_第10张图片

 

                              do while()+break可以避开执行某些语句,避开内存泄漏

 

9、小结

            for循环先进入循环再进入循环体

            for循环适合于循环次数固定的场合

            while循环先进行判断再进入循环体执行

            while循环适合于循环次数不定的场合

            do ... while 循环先执行循环体再进行条件判断

            do ... while 循环体至少执行一次循环体

 

你可能感兴趣的:(C语言进阶剖析【笔记】)