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語句的本質,注意對分支結構的優化,在以后的編程中對於提高程序的效率有很大的幫助。