通过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\n"); 9 break; 10 case 'B': 11 printf("good\n"); 12 break; 13 case 'C': 14 printf("pass\n"); 15 break; 16 default: 17 printf("fail\n"); 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\n"); 13 goto done; 14 lab_b: 15 printf("good\n"); 16 goto done; 17 lab_c: 18 printf("pass\n"); 19 goto done; 20 lab_default: 21 printf("fail\n"); 22 done: 23 return 0; 24 }
从上面两个程序中我们可以看出来switch语句是要与()内的score进行判断来进行跳转的,如果是’A’,跳转到printf(“”excellent\n);等等,而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\n”); 11 goto done; 12 true: 13 printf(“a is higher than b\n”); 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语句的本质,注意对分支结构的优化,在以后的编程中对于提高程序的效率有很大的帮助。