為什麼C語言沒有String類型?

別的語言基本都有String字元串類型吧?為什麼C就沒有呢?


C 是靜態弱類型語言。意味著類型(包括 size 等信息,你使用 sizeof 就是編譯時候得到的)在編譯的時候就能確定下來。

它的原生簡單類型有 char int float 這樣的,原生複合類型有 struct,以及「偉大」的 指針類型 primitive_type * .

這些類型的設計是在編譯時可以明確確定存儲空間大小,比如 char 佔一個位元組。32bit 機器上的指針為 4 Bytes.

所謂的 String 類型,它的大小不能在編譯的時候確定下來,因為你將存儲 string 的長度不是固定的,可大可小。你說編譯器給 string 分配多少合適?

所以在 C 中 string 只能以複合類型存在,一般用 struct 包含一個指針類型和一個表示存儲空間大小的整數類型。

你見到的其他語言的 string 也並非它最基本的類型。只不過作為標準庫提供出來了,方便使用。C 不屑於干這事 —— 因為它有「偉大」的指針。


不管C還是C++,語言都沒有string類型。你應當問「為什麼C語言的標準庫沒有string類型」。

其實C語言使用0終結的字元數組作為string類型,因為C的標準庫的字元串操作都是以此設計的。

另外,一些別的基本庫是有string類型的,比如glib就提供了包含有長度信息的string類型,及其操作函數。

struct GString {
gchar *str;
gsize len;
gsize allocated_len;
};


因為C語言沒有析構函數


typedef const char * string;


語言實現了String,開發者可以省心很多。

比C早的Pascal就實現了String,C沒實現,應該是語言的設計者沒有預見到字元串操作的頻密。

我喜歡Delphi,字元串操作方便 也是原因之一。


從語言的抽象度角度來說,C是底層語言,他解決的問題一般位於機器模型空間。但是,String應該屬於oo的東西,我覺得oo更多的是將位於機器模型的問題轉化為問題模型空間,更多符合人的思考方式,所以,C沒有必要抽象出這個類型。


C就是披上馬甲的彙編,String這個東西是棉襖,太厚了。


不是沒有,而是在某種程度上沒有java之類的String使用方便,c語言中的字元串相對於其他面向對象語言的String更多的暴露了底層的一些東西


你自己都說是「基本都」了,原生的string類型又不是必須的,可以用字元數組代替嘛~

像Prolog和Erlang還不是用的字元列表來表示,而沒有單獨的實現字元串類型。


因為C單身,沒有對象。


有啊,怎麼沒有啊,char× 和 wchar× 不就是 C 語言里的字元串類型嗎?

C 語言又不是面向對象型語言(不表示它不能用來表達面向對象),沒有類和方法的概念,你就算是定義一個 string 類型,又能怎樣呢?還不是要再定義一大堆類似這樣的函數:

size_t strlen(string str);

這跟現實中的 C 庫有什麼不同嗎?C 語言不過是把 string 內部怎麼構成的也告訴你了而已嘛。

不但如此,string 還會帶來一些不便:

  • C 語言沒有操作符重載,如果 string 不是一個數組,那麼 str[n] 這樣的寫法就沒有了,這不是自找麻煩嗎?

  • C 語言的拷貝很簡單,就是直接拷貝變數,拷貝指針就是讓兩個指針指向同一個地址。那麼,string str1 = str2,這樣的語句,表達什麼意思?如果是僅拷貝地址,那麼 string 不是指針哦,如果是複製內容,那 C 語言沒有操作符重載哦。

  • C 語言的字元串是一個數組,於是我們可以很簡單的通過指針滑動來表示子串,如果存在string,這麼做就行不通了。同時,C 語言規定字元串以『』結尾,但是我們常常可以通過規定長度將不以『』結尾的字元數組當作字元串處理,如果 string 存在,也行不通了。


沒有才顯得純粹。


推薦閱讀:

要開發一個jvm需要哪些知識?
學習C++,關於小項目練手的問題總是感覺不知道從哪入手?
有哪些go或c++框架可以完整模擬瀏覽器訪問網頁所涉及的全部元素?
現代編譯器是如何實現自定義函數在main()函數之後實現的呢?
C++ 「==」運算符取值問題?

TAG:程序員 | 編程語言 | 編程 | C編程語言 | CC |