唯讀變數 vs 符號常數

既然唯讀變數的目的是要避免不慎改變了那個變數的值,為什麼不用符號常數, 而要用唯讀變數?

讓我們先看看這兩者有何不同。 符號常數在檔頭定義,它其實是一個巨集 (macro)。 比如說

#define PI 3.14159
那麼,在函式中寫道
    printf("%f\n", PI*PI);
的時候,C 其實看到的是
    printf("%f\n", 3.14159*3.14159);
也就是說,凡是出現 PI 的地方,都被置換成 3.14159。 3.14159 是個常數,它不在記憶體中佔據一批固定的位置。

但是,如果說

    const double pi=3.14159
則 C 在記憶體中保留了 8 個位元,儲存 3.14159 這個值, 並且在編譯的時候,注意程式中沒有重新定義這個變數的值。 如果在函式中寫道
    printf("%f\n", pi*pi);
則 C 要到記憶體的某個特定位置去取得 pi 的值,然後做計算。 由此可見,在這種情況,符號常數 PI 似乎比唯讀變數 pi 更有效率。

但是,另外一種情況,就是唯讀變數比較有效率了。 比方說,我們知道 3.14159 顯然不夠精確,但是如果又不確定小數點下更多位的值, 我們應該用 4*atan(1) 來求取 pi 值。 這時候,如果說

#define PI 4*atan(1)
則每當您寫 PI 的時候,C 就將它看成 4*atan(1)。 如果函式中寫了 100 次 PI,就要做 100 次 4*atan(1) 計算。 反之,如果說
    const double pi=4*atan(1);
則只需要計算 4*atan(1) 一次,將答案儲存到變數 pi 裡面, 以後遇到 pi 只要到記憶體去拿即可,不必再做計算。 這種情況,就是唯讀變數 pi 比符號常數 PI 更有效率了。

習題

[ 前一節 ]‧[ 後一節 ]‧[ 回目錄 ]



注意:此處所有文件均為原著,個別的版權宣告日後會一一公布, 整體版面設計亦尚未完成。但仍請勿抄襲文字與圖片,以免觸犯著作權法。

Created: Apr 22, 2000
Last Revised: Apr 22, 2000
© Copyright 2000 Wei-Chang Shann 單維彰

shann@math.ncu.edu.tw