C 語言提供四種跳轉語句改變程式預設循序執行流程:goto、break、continue、return。前三種用於主流程控制,return 專用於函數返回,將於函數章節詳細說明。
語法:goto 標號;
標號定義:識別碼後接冒號 標號:,置於目標敘述前。
語意:程式流程無條件轉向指定標號處繼續執行。
常搭配 if 實現條件跳轉、構建迴圈、跳出多層迴圈。
#include <stdio.h>
void main() {
int n = 0;
printf("input a string\n");
loop:
if (getchar() != '\n') {
n++;
goto loop; // 回到 loop 標號繼續判斷
}
printf("%d", n); // 輸入換行符時結束,輸出字元計數
}
邏輯:利用 if+goto 模擬 while 迴圈,統計輸入行字元數(不含換行符)。
結構化程式設計原則:現代程式設計不建議濫用 goto,易造成「麵條程式碼」,增加理解與除錯困難度。優先使用結構化控制結構(if、for、while、switch)。
適用範圍:switch 敘述、迴圈敘述(for、while、do-while)。
功能:立即跳出當層 switch 或迴圈,執行其後敘述。
優勢:跳轉方向明確,無需標號配合,可提供迴圈多重出口,增加編寫彈性。
適用範圍:僅限迴圈主體內。
語法:continue;
語意:跳過本次迴圈剩餘敘述,直接進入下一次迴圈條件判斷。
關鍵區別:break 跳出迴圈,continue 僅結束本次迴圈。
void main() {
int n;
for (n = 7; n <= 100; n++) {
if (n % 7 != 0)
continue; // 非倍數跳過輸出,進入下一輪
printf("%d ", n);
}
}
#include <stdio.h>
void main() {
char a, b;
printf("input a string:\n");
b = getchar(); // 讀入首字元
while ((a = getchar()) != '\n') { // 讀入後續字元
if (a == b) { // 發現相鄰相同
printf("same character\n");
break; // 跳出迴圈
}
b = a; // 更新前一字元
}
}
void main() {
int n, i;
for (n = 2; n <= 100; n++) {
for (i = 2; i < n; i++)
if (n % i == 0) break; // 能整除非質數,跳出內層
if (i >= n) printf("\t%d", n); // 內層正常結束(i==n)為質數
}
}
#include <math.h>
#include <stdio.h>
void main() {
int n, i, k;
for (n = 3; n <= 100; n += 2) { // 僅檢查奇數(2 為唯一偶數質數)
k = sqrt(n); // 僅需判斷至 sqrt(n)
for (i = 2; i <= k; i++)
if (n % i == 0) break;
if (i > k) printf("\t%2d", n);
}
}
優化原理:
1. 排除偶數,步長設 2
2. 因子成對出現,僅需試除至 √n
大幅降低迴圈次數與執行時間。
| 語句 | 適用範圍 | 效果 | 典型用途 |
|---|---|---|---|
| goto | 全域 | 無條件跳轉至標號 | 錯誤處理跳出多層迴圈、狀態機實作 |
| break | switch、迴圈 | 跳出當層結構 | 搜尋找到目標提前結束、switch 分支結束 |
| continue | 迴圈主體 | 跳過本次剩餘,進入下輪判斷 | 過濾不符條件項目、跳過特定迴圈步驟 |