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

時間 2021-05-12 23:32:49

1樓:封禁讓我戒乎

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

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

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

2樓:王璐銘

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

3樓:

有啊,怎麼沒有啊,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 語言規定字串以『\0』結尾,但是我們常常可以通過規定長度將不以『\0』結尾的字元陣列當作字串處理,如果 string 存在,也行不通了。

4樓:

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

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

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

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

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

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

5樓:Xi Yang

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

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

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

struct GString ;

6樓:安而遇

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

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

C 未包含 string 為什麼可使用string?

d41d8c 需要用到std ios base型別,std ios base有個成員類叫failure,std ios base failure有個建構函式接受std string 現在這被認為是個錯誤 我個人希望standard library module unit能消除這個問題。 馬小刀 編譯...

Java求教!為什麼我用String類下的split方法拆分乙個字串時裡面的引數不能是File separator?

Mr.justin path.toString split Matcher.quoteReplacement File.separator BrandonYang 解決辦法如下,原因是符號 在regex裡面是轉義字元,而取file.separator在Windows環境下就是字串 String pa...

為什麼c語言unsigned char賦值給long使用的是movzbl而不是movzbq?

磨劍 最近看 深入理解計算機系統 的時候也有同樣的疑問。據查首先毫無疑問兩者都能達到同樣的效果,但是movzbl的位元組碼更短,X86 64上測試資料表明movzbl為3 byte,movzbq為4 byte,這就意味著更快更小。當然還有說法是movzbl指令效率更高一點,猜測這個可能跟硬體有關吧。...