常數 (constant)

什麼叫做常數

在 C 語言中大家常常看到像 myVariable + 1、 2 * 3.14159 、 'a' 、 "abcd" 等等, 這些都是程式裡常數的一種 (這種沒有名稱的常數之正式名稱為 literal)。

在代數中所謂的常數 和程式語言中的常數在概念上有些不同: 在代數中的常數 (例如: 在 f(x) = x^3 + c 中, c 表示在自變數與因變數改變時維持固定的數字, 其值不是觀察的重點, 但可以是某些合理的數字中的一個。 程式語言中的常數在觀念上和程式中的變數是一致的, 即 常數是一個 CPU 記錄數值資料的地方, 只是 CPU 在整個程式執行過程中, 只會去讀取該資料, 而不會修改該資料

常數可分為兩類:

  1. 文數字 (literal)

    例如:myVariable + 1 、 2 * 3.14159 、 'a' 、 "abcd" 等等, 這類常數 --- CPU 記錄資料的地方 --- 在程式內沒有一個像 sum 或是 count 這樣的名字, 可是其實你可以想像成它的名字就是像 1、2、3.14159 等名稱。 例如:程式中如果有兩個地方使用 1

    其實你可以想像 CPU 做的事情是到叫做 x 的變數和叫做 1 的常數去取得資料, 作相加的動作再把結果存入 x 變數裡面, 然後到叫做 z 的變數和叫做 1 的常數去取得資料, 做相加的動作在將結果存入變數 r 裡面。

  2. 常數變數 (constant variable)

    maxCount 是一個不可改變的整數變數, 程式裡不可以嘗試去改變這個變數的內容 (例如: maxCount = 99 ;), 除此之外, maxCount 和其他整數變數是一樣的, 那為什麼不在程式裡每一次出現 maxCount 的地方都用 100 來取代呢? 效果顯然是一樣的嘛。例如:

    printf("max value = 100\n"); for(i=0; i<100; i++) .... if(z<100) .... const int maxCount = 100 ; printf("max value = %d\n", maxCount); for(i=0; i<maxCount; i++) .... if(z<maxCount) ....

    原因:

    1. 常數變數有程式設計者指定的型態,編譯器可以幫忙檢查型態

    2. Source Debugger 內可以看到此常數變數的名稱

    3. 程式容易閱讀

    4. 程式容易維護

    那為什麼不乾脆用變數就好了呢?

    原因:怕你寫大的程式時, 不小心用到像 maxCount++ 這樣的敘述去更改此變數的內容, 或是傳進某一個函式內去更改到 maxCount 的內容。

    C 語言裡還容許你用前處理器的 #define 來定義常數, 例如:

    事實上編譯器在看到你的程式的時候所有的 MAXCOUNT 已經被前處理器取代為 100 了, 用這種東西也可以達到容易閱讀、容易維護的好處, 但是因為不是變數, 一些編譯器對於變數所作的檢查就不做了, Source Debugger 內也看不到這個傢伙的名稱, 因此建議你能夠用常數變數時盡量使用常數變數。

程式設計課程 首頁
by Pei-yih Ting
E-mail: pyting@cs.ntou.edu.tw