既然唯讀變數的目的是要避免不慎改變了那個變數的值,為什麼不用符號常數, 而要用唯讀變數?
讓我們先看看這兩者有何不同。 符號常數在檔頭定義,它其實是一個巨集 (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 單維彰