C 教材:for 迴圈

我們現在用 for 語法結構,重寫 f2c-sym.cforwhile 都是用來做迭代的,但是


#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;
    }
}

讓我們先介紹 for 語法:
for (INITIAL; CONDITION; ADDENDUM) 
    STATEMENTS_
其中 INITIALADDENDUM 各是一個語句, CONDITIONSTATEMENTS_while 語法中所說的 CONDITIONSTATEMENTS_ 完全相同。 for 的流程控制如下:
(1)   不論如何,INITIAL 都會執行一遍,且僅有一遍。 如果沒有需要,可以不寫任何字元在 INITIAL 的位置。 但是分號 ; 不能省略。例如前面的 f2c-for.c 第 2 和第 3 個指令, 可以改寫成
    int n=0;
    for (; n < STEPS; ++n) {

(2)   執行 CONDITION, 如果結果是 True,做 (3),否則跳到 (5)
(3)   執行 STATEMENTS_,結束後執行 ADDENDUM。 如果沒有需要,可以不寫任何字元在 ADDENDUM 的位置。 但是分號 ; 不能省略
(4)   回到 (2)
(5)   執行 STATEMENTS_ 的下一個指令,恢復正常流程
寫程式的人,要自行負責在 STATEMENTS_ADDENDUM 裡面 (通常是 ADDENDUM 裡面) 適當地改變CONDITION 的結果。否則 CONDITION 可能永遠是 True, 導至這個 for 會永遠執行下去。

根據一般程式語言的術語,一個 for 指令,又稱為一個 for 迴圈 (for-loop)。

在前面的例子中,看到一個 ++n 語句。 ++ 運算符號就是將變數值 +1 的意思。 亦即,++n 就是 n = n + 1 的同義詞。 但是前者的執行效率稍高一點兒。 所以,簡而言之,

for (n=0; n < STEPS; ++n)
就是要將 STATEMENTS_ 執行 STEPS 遍的意思。 其實您也可以寫成
for (n=1; n <= STEPS; ++n)
同樣是指要將 STATEMENTS_ 執行 STEPS 遍。

最後,我們提醒讀者,forwhile 其實並沒有多大的分別。 經過一點點巧思,總是可以將 forwhile 的語法互相轉換。 或許,這又是「風格」和「可讀性」的問題了。例如以下,是用 for 的皮來包裝 while 的骨 (forwhile骨?)。


#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);
}

這個程式似乎最短。此處 whileSTATEMENTS_ 只有一個指令,就省下了一對 { }

總而言之,關於華氏轉攝氏的程式,我們寫了四種不同風格的原始碼。 究竟哪一種最好?依您自己的風格來判斷吧。 我們終於要離開這個程式,進入下一階段的學習了。

習題

  1. 將您的 c2f-sym.c 改寫成 c2f-for.cc2f-whfor.c

[BCC16-C]
單維彰 (2000/03/24) ---
[Prev] [Next] [Up]