周建儒(四川信息職業(yè)技術(shù)學院,四川廣元628040)
?
C語言與C++語言幾點差異的應(yīng)用實例分析
周建儒
(四川信息職業(yè)技術(shù)學院,四川廣元628040)
摘要:C語言是面向過程的編程語言,C++語言是面向?qū)ο蟮木幊陶Z言,雖然它們是兩種不同的程序設(shè)計語言,但是在基礎(chǔ)語法的實際應(yīng)用中既有相似之處,又有細微差別,尤其是在字符串與字符數(shù)組的混合使用及互相轉(zhuǎn)換過程中體現(xiàn)得更為明顯,這些差異是其底層實現(xiàn)過程不同所致。結(jié)合程序?qū)嵗姆治隹梢钥闯?,兩種語言在布爾數(shù)據(jù)類型、字符串處理、指針與引用的參數(shù)傳遞等相關(guān)應(yīng)用中的差異。
關(guān)鍵詞:C語言;C++語言;實例分析
0 引言
C語言是面向過程的編程語言,C++語言是面向?qū)ο蟮木幊陶Z言,兩者之間有一些共同的特點——多種數(shù)據(jù)類型,豐富的運算符,運算靈活等。兩種語言在基礎(chǔ)語法上有相似之處,而在應(yīng)用上卻有細微的差別。本文就C語言和C++語言在邏輯值的計算、字符串處理、指針與引用方面的差異結(jié)合程序?qū)嵗敿毱饰觥?/p>
1 C++布爾類型的本質(zhì)分析
C語言沒有布爾類型(bool),C++語言有布爾類型。雖然C語言中沒有布爾類型,但是卻有邏輯運算和關(guān)系運算,也有邏輯真和邏輯假的概念[1],用1表示邏輯真,用0表示邏輯假。雖然C++語言有布爾類型,但是布爾值卻不是真正的邏輯值true和false,而是與C語言極為相似的表示方式——數(shù)值1和0分別表示邏輯真和假。因為邏輯值可以用數(shù)值1和0表示,所以C和C++的邏輯、關(guān)系運算并無本質(zhì)區(qū)別,應(yīng)用靈活。下面結(jié)合程序進行詳細分析。
示例程序1:


由于C++語言布爾類型變量的值是1(真)或0(假),所以布爾變量不僅可以進行邏輯、關(guān)系運算,還可以進行算術(shù)運算。例如程序1中的語句(1),就是邏輯值參與算術(shù)運算,關(guān)系運算8>=3的結(jié)果是邏輯值1,邏輯運算2&&-1的計算結(jié)果也是1,整個表達式1+2-1結(jié)果為整數(shù)2。此外,可以給布爾變量賦一個非零的整數(shù)(非0表示邏輯真),但是該布爾變量在參與運算時,其值不是所賦的整數(shù),而是1。因為它表示邏輯“真”,故當作1進行運算。例如程序1的語句(2)和(3),盡管變量x賦值為-2,但是2×x在計算時是2×1等于2,并非2×-2等于-4。關(guān)系表達式x>y等價于1>0,故關(guān)系成立,結(jié)果為“真”,值為1而并非0。
C語言與C++語言的關(guān)系、邏輯運算與Java語言有本質(zhì)的不同。例如語句(4)和(5),表達式a2 C字符串與C++字符串的區(qū)別
C++語言集成了C語言中字符串(簡稱C字符串)函數(shù),同時還擴展了字符串類string,所以,用C++語言編程時既可以使用C字符串的庫函數(shù),又可以使用string類的成員函數(shù)。當自定義函數(shù)的形式參數(shù)是string類的對象,而實際參數(shù)是C字符數(shù)組時,兩者類型不同,此時需要將C字符數(shù)組轉(zhuǎn)化為C++字符串string類的對象。具體的處理方式,我們通過以下示例程序來分析。
示例程序2:

標準C++中string類的構(gòu)造函數(shù)是string(const char *s);可以用C語言的字符串(或字符數(shù)組)構(gòu)造C++的string類對象(即C++字符串類string),例如程序2中的語句(1)正是此用。C++語言中的string類對象,可以使用重載運算符“+”進行字符串的連接,例如程序2中的語句(2),將字符串s2連接在字符串s1的末尾,并且不需考慮字符串s1是否能夠容納所有字符,因為string類的對象相當于動態(tài)數(shù)組,其內(nèi)存字節(jié)數(shù)會隨著字符串長度自動增加。然而,C語言的字符串連接卻不能使用“+”運算符連接,只能使用strcat()函數(shù),例如語句(4),前提條件是數(shù)組ps有足夠的長度可以容納字符串ps1的所有字符。此外,string類對象之間可以用比較運算符“==”“!=”直接進行大小關(guān)系的比較運算,如程序2中語句(5),也可以使用賦值運算符“=”將一個sring類對象直接賦值給另一個string對象,而C語言的字符數(shù)組是無法這般使用的。
c_str()函數(shù)原型是const char *c_str();它是string類的成員函數(shù),返回一個以空字符結(jié)尾的字符串,即返回當前字符串的首地址,但是不能直接將該地址賦值給字符類型的指針,可以將當前字符串拷貝給一個長度合適的字符數(shù)組,例如語句(3)。s2是string類的對象,s2.c_str()是將C++字符串對象s2轉(zhuǎn)化為C字符串常量,并將該字符串常量通過C語言的字符串拷貝函數(shù)拷貝到長度合適的字符數(shù)組ps中。
在用C++語言編程時,C字符串及庫函數(shù)和string類及成員函數(shù)可以混合使用,但是兩者有本質(zhì)的區(qū)別,C字符串是普通數(shù)據(jù)類型,要么是字符數(shù)組(char str[10]),要么是指向字符串的指針(char *str),內(nèi)存一旦分配,其長度是不能自動改變的,在進行字符串的連接、拷貝操作時一定要注意字符串的長度。C++字符串string是類,有豐富的成員函數(shù),使用格式是對象名.函數(shù)名();當C字符串和string的對象進行混合操作時,最好是將類型轉(zhuǎn)換為一致,盡可能避免C字符串與string類的對象直接計算。
C++字符串并不以‘
巴南区|
南江县|
乳山市|
古田县|
淮安市|
偏关县|
越西县|
孟连|
日土县|
浪卡子县|
象州县|
凤凰县|
红桥区|
临颍县|
玛沁县|
兴国县|
霍城县|
南投市|
楚雄市|
江安县|
吉隆县|
建水县|
全州县|
健康|
太仓市|
桐乡市|
巴塘县|
河间市|
洛宁县|
阿合奇县|
丹东市|
额济纳旗|
竹山县|
浮山县|
永修县|
德阳市|
天水市|
井陉县|
东山县|
台东市|
府谷县|