通过goto语句学习if...else、switch语句并简单优化

goto语句在C语言中实现的就是无条件跳转,第二章一上来就介绍goto语句就是要通过goto语句来更加清楚直观的了解控制结构。

我理解的goto语句其实跟switch语句有相似之处,都是进行跳转。不同的是goto语句是进行无条件的跳转,执行到这一句的时候直接就跳转了,而switch语句是要进行一个判断之后才能进行跳转。例如:

下面是用switch语句写的一个程序

 1 #include <stdio.h>
 2  int main(void)
 3  {
 4  char score;
 5  scanf("%c",&score);
 6  switch(score){
 7  case 'A':
 8  printf("excellent
");
 9  break;
10  case 'B':
11 printf("good
");
12  break;
13  case 'C':
14  printf("pass
");
15  break;
16  default:
17 printf("fail
");
18 }
19  return 0;
20  }

下面是用伪代码写的用goto语句实现上面switch语句的功能。

 

 1 #include <stdio.h>
 2 int main(void)
 3 {
 4     code * lab[] = { lab_a,lab_b,lab_c };
 5     char score;
 6     scanf("%c", &score);
 7     if (score>'C')
 8         goto lab_default;
 9     score -= ’A’;/*score减去A的值为目的标号在跳转表数组中的下标*/
10     goto_lab[score];
11 lab_a:
12     printf("excellent
");
13     goto done;
14 lab_b:
15     printf("good
");
16     goto done;
17 lab_c:
18     printf("pass
");
19     goto done;
20 lab_default:
21     printf("fail
");
22 done:
23     return 0;
24 }

 

从上面两个程序中我们可以看出来switch语句是要与()内的score进行判断来进行跳转的,如果是’A’,跳转到printf(“”excellent );等等,而goto语句是执行到lab[score]这一句的时候,直接跳转去执行lab[score]:。从这就可以看出来goto语句是无条件的跳转。switch语句和if…else语句都属于分支结构,但是两者之间是有差别的,如下用goto语句写的if…else循环。

 1 #include <stdio.h>
 2 int main(void)
 3 {
 4 int a,b;
 5 int t;
 6 scanf(“%d%d”,&a,&b);
 7 t=a>b;
 8 if(t==1)
 9 goto true;
10 printf(“a is lower than b
”);
11 goto done;
12 true:
13 printf(“a is higher than b
”);
14 done:
15 return 0;
16 }

 

if…else语句和switch语句记性对比会发现,switch语句需要提前定义一个数组,这就是一个标号数组,也就是switch语句的跳转表,根据case后边的标号直接去执行标号对应的程序,而if…else语句需要多次比较才会找到要执行的程序。这样对比就会发现switch语句的执行速度要比if…else快,但是通过对比也发现switch语句需要额外的存储空间去存储标号数组。不同的控制结构对于执行程序的效率影响很大,因此需要注意对于控制结构的优化。

if…else语句是要先判断再执行,需要进行对比之后才能进行执行。根据它的这个特点我们可以进行优化,尽量少进行判断就执行,比如统计一篇英文文章字母的个数和标点符号的个数。如果先判断是不是标点符号,再判断是否是英文字母的话,每统计一个英文字母都要进行两次判断,英文文章中出现英文字母的概率最大,因此先判断是否是英文字母就能提高这个程序的效率。

对于条件分支比较多的程序,一般来说switch语句的效率会高一点,但是在有些情况下if..else语句会更合适一点,特别是在与数字进行比较的时候,比如判断是否10~100之间时,用if…else语句会好一点。也就是说在一个区间范围内进行对比的时候,if…else语句会更方便一点。

总的来说了解了if…else语句和switch语句的本质,注意对分支结构的优化,在以后的编程中对于提高程序的效率有很大的帮助。

原文地址:https://www.cnblogs.com/Mr--Yang/p/6104857.html