在讀K&R版的The C Programming Language一書時,我在[介紹,第3頁]看到這樣一條說明:
因為C語言提供的數據類型和控制結構可以直接被大部分計算機系統所支持,所以在實現自包含程序時所需要的運行庫文件一般很小。
這段黑體說明了什麼?能否找到一個例子來說明C語言中的某種數據類型或控制結構不被某種計算機系統直接支持呢?
事實上,C語言中確實有不被直接支持的數據類型。
在許多嵌入式系統中,硬件上並沒有浮點運算單元。因此,如果你寫出下面的代碼:
float x =1.0f, y =2.0f;
return x + y;
可能會被轉化成下面這種形式:
unsigned x =0x3f800000, y =0x40000000;
return _float_add(x, y);
然後編譯器或標准庫必須提供'floatadd()'的具體實現,這會占用嵌入式系統的內存空間。依此去計算代碼在某個微型系統(譯者注:也就是指微型嵌入式系統)的實際字節數,也會發現有所增加。
另一個常見的例子是64位整型數(C語言標准中'long long'類型是1999年之後才出現的),這種類型在32位系統上也不能直接使用。古董級的SPARC系統則不支持整型乘法,所以在運行時必須提供乘法的實現。當然,還有一些其它例子。
相比起來,其它編程語言有更加復雜的基本類型。
比如,Lisp中的symbol需要大量的運行時實現支持,就像Lua中的table、Python中的string、Fortran中的array,等等。在C語言中等價的類型通常要麼不屬於標准庫(C語言沒有標准symbol或table),要麼更加簡單,而且並不需要那麼多的運行時支持(C語言中的array基本上就是指針,以NULL結尾的字符串實現起來也很簡單)。
異常處理是C語言中沒有的一種控制結構。非局部的退出只有'setjmp()'和'longjmp()'兩種,只能提供保存和恢復某些部分的處理器狀態。相比之下,C++運行時環境必須先遍歷函數調用棧,然後調用析構函數和異常處理函數。
C++ 隱式類類型轉化 Implicit Class-Type Conversions http://www.linuxidc.com/Linux/2013-01/78071.htm
C語言變長數組之剖析 http://www.linuxidc.com/Linux/2013-07/86997.htm
C語言需要注意的問題 http://www.linuxidc.com/Linux/2013-05/84301.htm
C語言位域的使用及其注意點 http://www.linuxidc.com/Linux/2013-07/87027.htm
C語言中簡單的for循環和浮點型變量 http://www.linuxidc.com/Linux/2013-08/88514.htm