在 C 語言程式設計中,goto 語句雖然能實現無條件跳轉,但過度使用會導致程式碼結構混亂,難以維護。許多初學者在閱讀舊代碼時,常遇到 goto label; 這類跳轉邏輯,想將其轉換為結構化的 while 迴圈,卻不知從何下手。
goto 的本質是將程式執行流程強制導向標籤位置。若該標籤處的代碼邏輯獨立且可複用,最佳實踐是將其封裝為獨立函數。具體步驟如下:
label: 之後的代碼提取出來,定義為一個函數(例如 gotoMethod())goto label; 處呼叫該函數break; 跳出當前迴圈或結構// 原始 goto 寫法
void original() {
int i = 0;
start:
if (i < 10) {
printf("%d ", i);
i++;
goto start;
}
}
// 轉換後的結構化寫法
void gotoMethod() {
static int i = 0; // 若需保持狀態可用 static 或全局變量
if (i < 10) {
printf("%d ", i);
i++;
}
}
void converted() {
while (1) {
gotoMethod();
if (/* 終止條件 */) break;
}
}
轉換時需特別注意變量作用域與生命週期。若原標籤代碼使用了局部變數,封裝函數時需透過參數傳遞或調整存儲類別。此外,goto 可能跳轉到巢狀結構中間,此類情況轉換較複雜,建議重構邏輯而非機械替換。
掌握這類轉換技巧,不僅能提升代碼可讀性,更有助於養成結構化程式設計的良好習慣。