goto 是所有流程控制指令的鼻祖。 在低階程式語言裡面,只有一個 goto 可以用來控制流程。 現今的程式語言教科書,把 goto 視為洪水猛獸, 一再勸戒學生不要使用 goto,原因是難以偵錯,不容易理解程式的邏輯結構。 但是,我還是認為 goto 是一個丟掉太可惜的工具。 對於大的程式,或許 goto 真的是弊多於利,但是對於不太複雜的程式, 只要頭腦清楚,應該不至於因為用了 goto 就昏頭轉向吧。
配合 goto 使用的,就是標籤。C 的標籤,就是一個合法的字。 這個字的規則,就和變數名、符號常數名、函式名的命名規則一樣。 標籤的名字不需宣告,只要在字的後面接一個冒號 :, 就使它成了標籤。而,在程式的任何地方,只要出現了
goto labelC 就立刻跳到
label:然後開始執行它的下一個指令。 由此可見,一個函式內的標籤只應該定義一次,否則 C 就不知道要 goto 哪裡去。
goto 經常用來結束層層相套的迴圈。break; 只能解除一層迴圈。 如果有超過一層的迴圈要一口氣解除,用 goto 比較方便。 這裡,我們應用 goto,再寫一遍 vsearch()。
int vsearch(int u[], unsigned int m, int v[], unsigned int n) { int i, j; for (i=0; i < m; ++i) for (j=0; j < n; ++j) if (u[i] == v[j]) goto found; return -1; found: return i; }
以下我們示範第二版的 prime.c 程式,它也是產生前 1000 個質數, 請與第一版的 prime.c 比較。 我們不再需要 isprime 這個旗標性質的變數。
#include <stdio.h> #define SIZE 1000 /* Calculate the first SIZE primes. Let the first prime be 2. (prime.c) */ main() { int p[SIZE], q, n, i, j; p[j=0] = n = 2; while (j < SIZE) { ++n; q = p[i=0]; while (q*q <= n) if (!(n%q)) goto next; else q = p[++i]; p[++j] = n; next: } for (j=0; j<SIZE; ++j) printf("%4d:%5d\n", j+1, p[j]); }
習題
注意:此處所有文件均為原著,個別的版權宣告日後會一一公布, 整體版面設計亦尚未完成。但仍請勿抄襲文字與圖片,以免觸犯著作權法。
Created: May 21, 2000
Last Revised: Feb 22, 2001
© Copyright 2001 Wei-Chang Shann 單維彰