語法:
do
敘述;
while (運算式);
執行語意:無條件先執行一次迴圈主體,再判斷條件運算式。若為真(非 0)繼續迴圈,否則結束。
與 while 差異:while 先判斷後執行(可能零次),do-while 保證至少執行一次。
while (--n); — 此為 do-while 獨有語法do { ... } while(...);void main() {
int a = 0, n;
printf("\n input n: ");
scanf("%d", &n);
do
printf("%d ", a++ * 2);
while (--n); // 先輸出再遞減,避免多執行一次
}
若條件寫 while (n--) 會多印一個值,因 do-while 先執行後判斷。
語法:
for (運算式1; 運算式2; 運算式3)
敘述;
| 運算式 | 慣用用途 | 特性 |
|---|---|---|
| 運算式1 | 迴圈變數初始化 | 僅執行一次,可省略(外部預設初值) |
| 運算式2 | 迴圈條件判斷 | 每輪迴圈前評估,為真執行主體,可省略(恆真) |
| 運算式3 | 迴圈變數更新 | 每輪主體結束後執行,可為逗號運算式 |
三運算式皆為選擇性,分號不可省略。
void main() {
int n, s = 0;
for (n = 1; n <= 100; n++)
s = s + n;
printf("s=%d\n", s);
}
void main() {
int a = 0, n;
printf("\n input n: ");
scanf("%d", &n);
for (; n > 0; a++, n--) // 逗號運算式:a++ 更新輸出值,n-- 控制次數
printf("%d ", a * 2);
}
void main() {
int a = 0, n;
printf("\n input n: ");
scanf("%d", &n);
for (; n > 0; ) {
a++; n--;
printf("%d ", a * 2);
}
}
void main() {
int a = 0, n;
printf("\n input n: ");
scanf("%d", &n);
for (;;) {
a++; n--;
printf("%d ", a * 2);
if (n == 0) break; // 必須在主體內提供跳出機制
}
}
警示:無跳出機制的 for(;;) 將形成死迴圈。
#include <stdio.h>
void main() {
int n = 0;
printf("input a string:\n");
for (; getchar() != '\n'; n++); // 主體為空敘述(分號)
printf("%d", n);
}
關鍵:運算式3 用於計數,主體為空。空敘述分號不可省略,否則後續 printf 會被誤視為主體。
四種控制語句可任意互相巢狀:
(1) for { ... while() { ... } ... }
(2) do { ... for() { ... } ... } while();
(3) while { ... for() { ... } ... }
(4) for { ... for() { ... } ... }
void main() {
int i, j, k;
for (i = 1; i <= 3; i++) {
for (j = 1; j <= 3 - i + 5; j++)
printf(" "); // 列印空格對齊
for (k = 1; k <= 2 * i - 1 + 5; k++) {
if (k <= 5) printf(" ");
else printf("*");
}
printf("\n");
}
}
輸出對稱三角形圖案,展示雙重迴圈控制列與行。
for(...); { ... } 導致主體為空,大括號區塊僅執行一次<= vs <)導致多/少一次迴圈for(int i=0; ...) 限制變數作用域於迴圈內