|
icyprwehsqd640115516311.gif (60.41 KB, 下載次數(shù): 2)
下載附件
保存到相冊(cè)
icyprwehsqd640115516311.gif
6 天前 上傳
0 {0 Q! A' j; j1 L4 c9 h點(diǎn)擊上方藍(lán)色字體,關(guān)注我們
8 b- }5 a; t+ QC語言的字符串結(jié)束符設(shè)計(jì)是一個(gè)典型的“最小開銷換取最大靈活性”的例子。2 p" B, T/ r# @
" C! y# F% y2 n* y% f
u0ez5pt01gr640115516412.png (628.84 KB, 下載次數(shù): 1)
下載附件
保存到相冊(cè)
u0ez5pt01gr640115516412.png
6 天前 上傳
& {6 |4 G3 K+ C2 V/ J/ G$ Q通過簡單的 \0 結(jié)尾,它實(shí)現(xiàn)了高度靈活的字符串處理機(jī)制,同時(shí)也給了開發(fā)者充分的控制權(quán)。
/ L H9 b/ Y* a9 x( x2 ^8 ~1' v/ A' \) C& [( @- l% o' U
精品專欄字符串的定義與內(nèi)存管理
4 }9 P2 g2 r2 X( X* \; P在C語言中,字符串實(shí)際上是一個(gè)字符數(shù)組,但為了便于操作和函數(shù)調(diào)用,C語言使用了一個(gè)特殊的約定:字符串必須以一個(gè)空字符(即 \0,ASCII 值為 0)作為結(jié)尾。0 p5 d$ a: h9 ^7 z
8 a2 l3 R- D/ b o) g$ v& P
這種設(shè)計(jì)方便了諸如 strlen、strcpy 等標(biāo)準(zhǔn)庫函數(shù),它們都依賴于字符串以 \0 結(jié)尾來判斷字符串的結(jié)束位置。" i8 [- m' q0 S3 }0 i3 n; K
2
" s) ~. p7 c9 F" [數(shù)組的處理方式差異
) k/ h( ~8 ?6 d在C語言中,數(shù)組并沒有提供自帶的長度信息,因此一般的數(shù)組無法通過簡單的遍歷得知其長度。2 S) G- s4 y+ `
, _2 m; A5 l8 d5 X5 P4 V) P對(duì)于 int、float 等其他類型的數(shù)組,C并不會(huì)添加額外的結(jié)束符。
" W& v- e7 J' l1 l( N7 _/ r1 R9 \4 Y! q! g7 W7 R) D! s; ] `
C語言設(shè)計(jì)哲學(xué)中的一個(gè)重要特點(diǎn)是“讓程序員控制細(xì)節(jié)”,所以數(shù)組的長度和終止條件完全交由開發(fā)者管理。: X0 h% A* Y+ D* N3 L9 m7 l
" p; k1 i/ y- F7 @4 r. K9 ^這種設(shè)計(jì)避免了內(nèi)存浪費(fèi),也更貼近硬件層面的直接操作,非常適合早期的系統(tǒng)資源受限環(huán)境。
- C8 P6 Z- A- K/ L- }7 z5 X' m3; K. j) T$ O& u9 k% q
字符串結(jié)束符的作用和靈活性
0 `# A5 W& n- B/ L" {+ _字符串以 \0 結(jié)束具有極大的靈活性。 D1 e3 ]8 S5 z/ h: P7 E
: S' o, ?7 b# h1 I: u2 ]例如,在C中聲明 char str[5] = "hi"; 時(shí),字符串實(shí)際上存儲(chǔ)在一個(gè)包含五個(gè)字符的數(shù)組中,即存儲(chǔ)為{'h', 'i', '\0', '\0', '\0'}。
! z% h) S5 V( y. I) r. |% m r- Z8 l5 L( j7 }0 V) H9 b
這種方式允許字符串可以在數(shù)組中占據(jù)任何長度,并且 \0 可以出現(xiàn)在任何位置,定義字符串的終止。
& s# W1 B3 H8 _8 j" K+ R- J) J( n7 \: [" s
這樣設(shè)計(jì)不僅節(jié)省了存儲(chǔ)空間,也減少了額外的計(jì)算開銷,因?yàn)槌绦蛑恍枰闅v到 \0 即可。
6 \8 M9 Q$ i4 s) C- [" Y( f4$ Y i7 q, u5 k# r4 e: q
與其他語言和類型的比較
8 f2 N8 V: ^% A! @- F: @ k4 b& ?5 |與C++和Java等其他語言不同,C語言中沒有內(nèi)置的字符串類型或自動(dòng)管理的長度機(jī)制。% q* ~ v' z6 |$ h. {& v
3 V8 u8 b" ?5 W- ]8 V0 t# w
例如在C++的std::string中,字符串對(duì)象有自己的長度記錄,這樣可以避免通過結(jié)束符來判斷長度。( V; y& C. Q" Y- x; o
% C3 T% ]; ^$ p) L/ d) ^9 o6 @但是C語言則保持其簡單高效的特點(diǎn),避免了這種長度屬性,使用結(jié)束符實(shí)現(xiàn)了接近無額外開銷的字符串處理機(jī)制。& p* Y) s1 j) d: S# M" A& J+ D
& G$ A2 k2 O+ r
這種設(shè)計(jì)讓C語言字符串的存儲(chǔ)和操作非常貼近底層硬件,更符合C語言“精簡高效”的設(shè)計(jì)理念。 M2 e7 U. v) s/ n% p
5
0 L8 Z2 F$ |* N2 j+ ^' p% r其他數(shù)組沒有結(jié)束符的原因
) D \8 C& W' L5 G3 s其他類型的數(shù)組(如 int 或 float)沒有結(jié)束符的根本原因在于:這些數(shù)組的元素在定義上可以是任何值,沒有特殊的“結(jié)束符”表示法。* t; e6 o2 w+ i
* Y1 {3 L) n, x) W& P2 L例如,在一個(gè)整數(shù)數(shù)組中添加“零”并不能被視為終止標(biāo)志,因?yàn)榱憧赡芫褪菙?shù)組的一部分內(nèi)容。 B* _ W- K$ Q4 w+ M
9 c5 o/ o, ~ B# Z7 W% G; r即便我們定義一個(gè)“特殊值”來標(biāo)記數(shù)組結(jié)束,這樣的設(shè)計(jì)也會(huì)增加數(shù)組操作的復(fù)雜性,而且會(huì)浪費(fèi)存儲(chǔ)空間。7 I6 u) h% f3 w. ]! J) s
68 c* ^% T1 `9 S& e( |' Y& H! F
從編譯器的角度看設(shè)計(jì)選擇9 [) B) ?9 O) X& d7 X3 i$ |
C編譯器在處理字符數(shù)組時(shí)會(huì)自動(dòng)為字符串字面量添加一個(gè) \0。
. Y" c# }$ \% q. @1 w8 L/ X6 z i* P, m. V6 O; {, A* @
例如,當(dāng)我們聲明 char str[] = "Hello"; 時(shí),編譯器會(huì)分配6個(gè)字節(jié)的內(nèi)存,其中包括 H, e, l, l, o, \0。
& D6 E' N3 k, D& F, j; V8 r3 i! L: S& A4 O" B# n1 I1 j$ U* L
而對(duì)于其他類型的數(shù)組,編譯器無法預(yù)先設(shè)定結(jié)束條件,因?yàn)闆]有特定的值可以標(biāo)記“數(shù)組的結(jié)尾”,因此編譯器無法自動(dòng)添加一個(gè)結(jié)束符,這也是由C語言設(shè)計(jì)的“通用性”和“直接性”所決定的。
' s# P) G% D a" x6 T" n+ ^. {7, ~" q, Y7 F: O/ Q1 ~* k! O) s
歷史原因與語言簡潔性
& u* g D/ X: G7 d. m+ JC語言最早的設(shè)計(jì)誕生于20世紀(jì)70年代,當(dāng)時(shí)的內(nèi)存資源非常寶貴,C的創(chuàng)始人Dennis Ritchie選擇了以 \0 標(biāo)記字符串結(jié)尾,因?yàn)檫@樣不僅節(jié)省了內(nèi)存空間(不需要額外的長度存儲(chǔ)),而且可以與硬件的零值對(duì)齊,快速進(jìn)行內(nèi)存讀取。& b- b+ N) g: J) L3 X6 B- Z
. ^* E+ r! ~1 Z; [8 V相比之下,其他數(shù)據(jù)類型數(shù)組并沒有特殊的結(jié)束需求,所以沒有額外的結(jié)束標(biāo)記。
. J: `! Q7 R+ j/ J
Q0 E; H3 e8 f字符串結(jié)束符雖然在現(xiàn)今看來似乎有些“原始”,但它符合C語言的整體設(shè)計(jì)哲學(xué):簡單、直接、讓開發(fā)者完全掌控程序的行為。
) |* R* K$ @" \' k/ W5 C
wg5su5gcy1u640115516512.jpg (71.14 KB, 下載次數(shù): 3)
下載附件
保存到相冊(cè)
wg5su5gcy1u640115516512.jpg
6 天前 上傳
" c2 C/ `: g4 c5 j: C
ayh24qb3ulj640115516612.gif (45.46 KB, 下載次數(shù): 2)
下載附件
保存到相冊(cè)
ayh24qb3ulj640115516612.gif
6 天前 上傳
0 y& B2 F5 c0 w8 X% R7 |
點(diǎn)擊閱讀原文,更精彩~ |
|