我們現在用 for 語法結構,重寫 f2c-sym.c。 for 和 while 都是用來做迭代的,但是
#include <stdio.h> #define START 30 #define GAP 5 #define STEPS 15 /* 將華氏溫度,從 START 開始,每 GAP 一次, 做 STEPS 次的攝氏溫度換算 (f2c-for.c) */ main() { double fahr=START; int n; for (n=0; n < STEPS; ++n) { printf("%3.0f\t%4.1f\n", fahr, 5*(fahr-32)/9); fahr = fahr + GAP; } }
其中 INITIAL 和 ADDENDUM 各是一個語句, CONDITION 和 STATEMENTS_ 與 while 語法中所說的 CONDITION 和 STATEMENTS_ 完全相同。 for 的流程控制如下:for (INITIAL; CONDITION; ADDENDUM) STATEMENTS_
(1) 不論如何,INITIAL 都會執行一遍,且僅有一遍。 如果沒有需要,可以不寫任何字元在 INITIAL 的位置。 但是分號 ; 不能省略。例如前面的 f2c-for.c 第 2 和第 3 個指令, 可以改寫成寫程式的人,要自行負責在 STATEMENTS_ 或 ADDENDUM 裡面 (通常是 ADDENDUM 裡面) 適當地改變CONDITION 的結果。否則 CONDITION 可能永遠是 True, 導至這個 for 會永遠執行下去。int n=0; for (; n < STEPS; ++n) {
(2) 執行 CONDITION, 如果結果是 True,做 (3),否則跳到 (5)
(3) 執行 STATEMENTS_,結束後執行 ADDENDUM。 如果沒有需要,可以不寫任何字元在 ADDENDUM 的位置。 但是分號 ; 不能省略
(4) 回到 (2)
(5) 執行 STATEMENTS_ 的下一個指令,恢復正常流程
根據一般程式語言的術語,一個 for 指令,又稱為一個 for 迴圈 (for-loop)。
在前面的例子中,看到一個 ++n 語句。 ++ 運算符號就是將變數值 +1 的意思。 亦即,++n 就是 n = n + 1 的同義詞。 但是前者的執行效率稍高一點兒。 所以,簡而言之,
就是要將 STATEMENTS_ 執行 STEPS 遍的意思。 其實您也可以寫成for (n=0; n < STEPS; ++n)
同樣是指要將 STATEMENTS_ 執行 STEPS 遍。for (n=1; n <= STEPS; ++n)
最後,我們提醒讀者,for 和 while 其實並沒有多大的分別。 經過一點點巧思,總是可以將 for 和 while 的語法互相轉換。 或許,這又是「風格」和「可讀性」的問題了。例如以下,是用 for 的皮來包裝 while 的骨 (for皮while骨?)。
#include <stdio.h> #define LOW 30 #define HIGH 100 #define GAP 5 /* 將華氏溫度,從 LOW 到 HIGH,每 GAP 一次, 換算成對應的攝氏溫度 (f2c-whfor.c) */ main() { double fahr; for(fahr=LOW; fahr <= HIGH; fahr = fahr + GAP) printf("%3.0f\t%4.1f\n", fahr, 5*(fahr-32)/9); }
總而言之,關於華氏轉攝氏的程式,我們寫了四種不同風格的原始碼。 究竟哪一種最好?依您自己的風格來判斷吧。 我們終於要離開這個程式,進入下一階段的學習了。
習題