![]() |
C 教材:sizeof 和 ++、-- 算子 |
以下程式計算一個從 stdin 輸入的純文字檔案有幾個字元 (byte),EOF 不算在內。 通常以 int 資料型態來計數。 但是一般的 int 是 32-bit,故最大只能記錄到 231-1。 為了能夠處理很大的檔案,所以宣告計數的資料型態是 long, 如果系統有支援的話,它是 64-bit 的長整數, 最大可以記錄到 263-1。
#include <stdio.h> /* 簡化的 UNIX wc -c 程式,long while 版本 (nc-long.c) */ main() { long nc=0; while (getchar() != EOF) ++nc; printf("%ld\n", nc); }
我們又看到 ++ 符號。 ++ 運算符號的優先度是 13,右傾。++n 和 n++ 的意義, 在某些場合是不同的。詳情以後再談。
相對有一個 -- 運算符號,優先度也是 13,右傾。 --n; 就是將 n = n - 1; 的意思。
但是某些系統內的 C 編譯程式並不支援長整數。 即使如此,也不見得會在編譯的時候看到任何訊息。 比較保險的方法是,檢查 long 資料型態的含量。 語句是 sizeof(long),回應的值是整數資料型態, 代表 long 的資料含量是幾個 bytes。
如果 long 不夠長 (例如和 int 一樣是四個拜), 還有一個方法是用 double 來計數。 雙精度浮點數並不能真實記錄從 -263 到 263-1 的所有整數,因為畢竟它的底數只有 52 bits。 但是它總是比 32-bit 的 int 有能力記錄更大的整數。
如果要改用 double 來計數,以上的程式應改寫成
#include <stdio.h> /* 簡化的 UNIX wc -c 程式,double while 版本 (nc-double.c) */ main() { double nc=0; while (getchar() != EOF) ++nc; printf("%.0f\n", nc); }
以上程式可以用 a.out < file 來執行, 並且可以和 wc -c file 的結果相比對。 結果應該相同才對。 例如可以試試看 a.out < mywc-c1.c。 我們讓 a.out 這個程式檢查它自己的原始碼有幾個字元。
最後,我們再提醒兩件事: 第一,sizeof 就和 long、double 一樣, 都是 C 的保留字。 換句話說,sizeof() 不是外部函式, 它是 C 本身知道怎麼做的少數幾件事之一。
其次,我們再練習一次 while 語法轉 for 語法。
#include <stdio.h> /* 簡化的 UNIX wc -c 程式,double for 版本 (nc-whfor.c) */ main() { double nc=0; for (; getchar() != EOF; ++nc); printf("%.0f\n", nc); }
最後,我們提醒讀者,++ 和 -- 只能作用在變數上。 所以,例如 ++3 和 ++sizeof(int) 都是錯誤的。 因為,轉換成
3 = 3 + 1; sizeof(int) = sizeof(int) + 1;這些指令,都是錯誤的。等號 = 的左邊必需是變數,用來儲存等號右邊的執行結果。
習題
![]() |
![]() |
單維彰 (2000/03/30) --- 00/05/18 (單), 03/04/26 (單) |