我正在學習有關C++中的指針。定義strlen的函數說明
我研究並找到了將strlen定義爲這樣的手動函數。
int strlen(const char *a){
const char *b;
for (b=a;*b;++b);
return b-a;
}
任何人都可以用純英文解釋這段代碼嗎?特別是,爲什麼* b在for循環中被設置爲終止條件?
這不是家庭作業的答案。這只是我在研究時出現的一個問題。謝謝。
我正在學習有關C++中的指針。定義strlen的函數說明
我研究並找到了將strlen定義爲這樣的手動函數。
int strlen(const char *a){
const char *b;
for (b=a;*b;++b);
return b-a;
}
任何人都可以用純英文解釋這段代碼嗎?特別是,爲什麼* b在for循環中被設置爲終止條件?
這不是家庭作業的答案。這只是我在研究時出現的一個問題。謝謝。
這是一個特別簡單的C代碼,帶有一個for
循環,沒有主體。
的想法是指針b
設置爲字符串a
的開始,並保持前進,直到你打字符'\0'
,這表明stirng結束(即作爲空終止)。在該循環中沒有其他任何事情需要做,因此它的身體是空的。
一旦循環結束,從b
中減去a
就會得到字符串的初始字符與其空終止符(即字符串的長度)之間的字符數。
這裏是寫入相同的循環更可讀的方式:
for (b=a ; *b != '\0' ; ++b) // Use explicit comparison to zero
; // Put semicolon on a separate line
當C的表達用在需要的邏輯表達式,爲零的隱式比較施加一個語句中使用。因此,*b != '\0'
與*b
相同。
在C和C++字符串真的叫空終止字節串。 空終止符等於零。在C和C++中,零值相當於假。
循環所做的是迭代,直到「當前字符」(由b
指向)變得等於終止符。
此外,在真正的C++ 11中,最好使用'std :: string'作爲字符串 –
@BasileStarynkevitch:「11」修飾符可能是無關緊要的 - 該點代表任何版本的語言標準。這表示在C++中存在以null結尾的字符串和'std :: strlen()';它不會因爲使用它們而成爲「真正的C++」。事實上,C++ 11例如用'std :: strlen_s()'擴展C字符串處理函數。 – Clifford
@某些程序員老兄:謝謝你很難選擇哪個答案更好,但你也回答了我的問題。 –
作爲條件的'* b'與'* b!='\ 0''相同,也就是說'b'不指向字符串終止符或字符串中的所有字符。 – pmg
'strlen'接受以空字符結尾的字符串,條件'* b'在到達字符串末尾時將變爲false。你可以將它改寫爲'if('\ 0'== * b){break;}' – VTT
C和C++是不同的語言。你的代碼是C.你需要花更多的時間閱讀關於C的內容。''* b'正在引用'b'指針。當它指向的'char'是0時,它變成假。 –