• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      如何優(yōu)化C++程序代碼編寫

      2012-04-29 05:32:13郭妍
      考試周刊 2012年23期
      關(guān)鍵詞:編譯器語(yǔ)句代碼

      郭妍

      C和C++可以說(shuō)是所有編程語(yǔ)言中關(guān)系最為緊密的兩個(gè)。在目標(biāo)上,C++被定位為“a better C”;在名稱上,C++有一個(gè)別名叫做“C with classes”;在語(yǔ)法上,C更是C++的一個(gè)子集,C++幾乎支持C語(yǔ)言的全部功能。如何優(yōu)化C++程序代碼,在多年的教學(xué)經(jīng)驗(yàn)中,我認(rèn)為有一種方法,即不要讓main函數(shù)返回void。

      同C程序一樣,每個(gè)C++程序都包含一個(gè)或多個(gè)函數(shù),而且必須有一個(gè)函數(shù)命名為main,并且每個(gè)函數(shù)都由具有一定功能的語(yǔ)句序列組成。操作系統(tǒng)將main作為程序入口,調(diào)用main函數(shù)執(zhí)行程序;main函數(shù)執(zhí)行其語(yǔ)句序列,并返回一個(gè)值給操作系統(tǒng)。在大多數(shù)系統(tǒng)中,main函數(shù)的返回值用于說(shuō)明程序的退出狀態(tài)。如果返回0,則代表main函數(shù)成功執(zhí)行完畢,程序正常退出,否則代表程序異常退出。

      然而在編寫C++程序入口函數(shù)main的時(shí)候,很多程序員,特別是一些具有C基礎(chǔ)的C++程序員時(shí)經(jīng)常會(huì)寫出如下格式的main函數(shù):

      1.void main()

      2.{

      3.// some code... }

      上述代碼在VC++中是可以正確編譯、鏈接、執(zhí)行的。編譯信息如下所示:

      1. 1>------ 已啟動(dòng)生成: 項(xiàng)目: MainCpp, 配置: Debug Win32 ------

      2. 1>main.cpp

      3. 1>MainCpp.vcxproj -> G:\MainCpp\Debug\MainCpp.exe

      ========== 生成: 成功1 個(gè),失敗 0 個(gè),最新 0 個(gè),跳過(guò) 0 個(gè)==========

      但是當(dāng)你將代碼放在Linux環(huán)境下,采用GCC編譯器進(jìn)行編譯時(shí),你會(huì)吃驚地發(fā)現(xiàn)編譯器拋出了如下錯(cuò)誤信息:

      1.[develop@localhost ~]g++ main.cpp

      main.cpp:2: 錯(cuò)誤 :′::main′必須返回′int′

      為什么同樣的代碼會(huì)出現(xiàn)兩種不同的結(jié)果呢?這還是跨平臺(tái)的C/C++語(yǔ)言嗎?不要對(duì)C/C++的跨平臺(tái)性產(chǎn)生質(zhì)疑,之所以會(huì)這樣,在很大程度上要?dú)w咎于市面上一些書的“誤導(dǎo)”,以及微軟對(duì)VC++編譯器main返回值問(wèn)題的縱容。 在C和C++中,不接收任何參數(shù)也不返回任何信息的函數(shù)原型為“void f(void);”,所以很多人認(rèn)為,不需要程序返回值時(shí)可以把main函數(shù)定義成void main(void),然而這種想法是非常錯(cuò)誤的。有一點(diǎn)必須明確:C/C++標(biāo)準(zhǔn)從來(lái)沒(méi)有定義過(guò)void main()這樣的代碼形式。C++之父 Bjarne Stroustrup 在他的主頁(yè)FAQ 中明確地寫著這樣一句話:“在C++中絕對(duì)沒(méi)有出現(xiàn)過(guò)void main(){/* ... */}這樣的函數(shù)定義,在C語(yǔ)言中也是。”

      main函數(shù)的返回值應(yīng)該定義為int類型,在C和C++標(biāo)準(zhǔn)中都是這樣規(guī)定的。在C99標(biāo)準(zhǔn)中規(guī)定,只有以下兩種定義方式是正確的:

      1.int main( void )

      2. int main( int argc, char *argv[] )

      在C++03中也給出了如下兩種main函數(shù)的定義方式:

      1.int main()

      2.int main( int argc, char *argv[] )

      雖然C和C++標(biāo)準(zhǔn)并不支持void main(),但在部分編譯器中void main()依舊是可以通過(guò)編譯并執(zhí)行的,比如微軟的VC++。由于微軟產(chǎn)品的市場(chǎng)占有率與影響力很大,因此在某種程度上加劇了這種不良習(xí)慣的蔓延。不過(guò),并非所有的編譯器都支持void main(),gcc就站在了VC++的對(duì)立面,它是這一不良習(xí)氣的堅(jiān)定抵制者,它會(huì)在編譯時(shí)就明確地給出一個(gè)錯(cuò)誤。

      如果你堅(jiān)持在某些編譯器中使用void main()這種非標(biāo)準(zhǔn)形式的代碼,那么當(dāng)你把程序從一個(gè)編譯器移植到另一個(gè)編譯器時(shí),你就要對(duì)可能出現(xiàn)的錯(cuò)誤負(fù)責(zé)。除了有void main()這樣的不規(guī)范格式外,在C語(yǔ)言程序中,尤其是一些老版本的C代碼中,你還會(huì)經(jīng)常看到main()這樣的代碼形式。

      一些老的C標(biāo)準(zhǔn)(諸如C90)是支持main()這樣的形式的。之所以支持,是因?yàn)樵诘谝话娴腃語(yǔ)言中只有int一種數(shù)據(jù)類型,并不存在char、long、float、double等這些內(nèi)置數(shù)據(jù)類型。既然只有int一種類型,也就不必顯式地為main函數(shù)標(biāo)明返回類型了。在Brian W.Kernighan和Dennis M.Ritchie的經(jīng)典巨著The C Programming Language,Second Edition中用的就是main()。后來(lái),在C語(yǔ)言的改進(jìn)版中數(shù)據(jù)類型得到了擴(kuò)充,為了能兼容以前的代碼,標(biāo)準(zhǔn)委員會(huì)就做出了如下規(guī)定:不明確標(biāo)明返回值的,默認(rèn)返回值為int。在C99標(biāo)準(zhǔn)中,則要求編譯器對(duì)于main()這種用法至少要拋出一個(gè)警告。

      main函數(shù)返回值的作用,可以采用下面的方法加以驗(yàn)證。

      首先,編寫main.cpp文件,文件內(nèi)容如下所示:

      1.int main()

      2.{

      3. return 0;

      4.}

      在Linux環(huán)境下,采用命令:g++ main.cpp

      生成可執(zhí)行文件a.out。然后,執(zhí)行命令:./a.out && ehco “success”

      結(jié)果輸出success。

      修改上述程序:

      1.int main( )

      2.{

      3.return -1;

      4.}

      做同樣測(cè)試,無(wú)輸出。

      命令A(yù) && B中的&&類似于C++中的并操作(&&),如果A命令正確執(zhí)行,接著就會(huì)執(zhí)行命令B;如果A出現(xiàn)異常,則B不執(zhí)行。通過(guò)以上分析可知,當(dāng)main()返回0時(shí),a.out正確執(zhí)行并返回;但是如果返回-1,程序就不能正常返回了。

      最后,還要說(shuō)明C++標(biāo)準(zhǔn)中一個(gè)“好壞難定”的規(guī)定:在main函數(shù)中,return語(yǔ)句的作用在于離開(kāi)main函數(shù)(析構(gòu)掉所有具有動(dòng)態(tài)生存時(shí)間的對(duì)象),并將其返回值作為參數(shù)調(diào)用exit函數(shù)。如果函數(shù)執(zhí)行到結(jié)尾而沒(méi)有遇到return語(yǔ)句,則其效果等同于執(zhí)行了return 0。

      也就是說(shuō),如果函數(shù)執(zhí)行到main結(jié)束處時(shí)沒(méi)有遇到return語(yǔ)句,編譯器就會(huì)隱式地為你加上return 0;,效果與返回0相同。之所以說(shuō)這條規(guī)定“好壞難定”,一方面是因?yàn)樗屇闶∪チ硕嗲脦讉€(gè)字的麻煩,另一方面是因?yàn)檫@種便捷會(huì)讓某些程序員忽視編譯器代替他做的工作,而在思維中形成一種錯(cuò)誤的認(rèn)識(shí):此函數(shù)可以無(wú)返回。

      在應(yīng)用這一規(guī)則時(shí),需要注意以下兩點(diǎn):

      (1)main函數(shù)的返回類型是int,不是void或其他類型。

      (2)該規(guī)則僅僅對(duì)main函數(shù)適用。

      按照以上標(biāo)準(zhǔn)得到了一個(gè)完全合乎C/C++標(biāo)準(zhǔn)的最小化的完整C++程int main(){} 要想保證程序具有良好的可移植性能,就要標(biāo)明main函數(shù)返回int,而不是void。

      猜你喜歡
      編譯器語(yǔ)句代碼
      重點(diǎn):語(yǔ)句銜接
      基于相異編譯器的安全計(jì)算機(jī)平臺(tái)交叉編譯環(huán)境設(shè)計(jì)
      創(chuàng)世代碼
      創(chuàng)世代碼
      創(chuàng)世代碼
      創(chuàng)世代碼
      精彩語(yǔ)句
      通用NC代碼編譯器的設(shè)計(jì)與實(shí)現(xiàn)
      如何搞定語(yǔ)句銜接題
      編譯器無(wú)關(guān)性編碼在微控制器中的優(yōu)勢(shì)
      伊春市| 宜兰县| 安福县| 灵山县| 土默特右旗| 汕头市| 乐亭县| 临沭县| 新乐市| 泰安市| 乐都县| 南通市| 田阳县| 班玛县| 绥化市| 章丘市| 黄平县| 水城县| 韩城市| 西和县| 石楼县| 邯郸市| 古蔺县| 长寿区| 荥经县| 德令哈市| 会泽县| 桂林市| 垫江县| 新邵县| 兴宁市| 衡东县| 洛宁县| 仙游县| 汤原县| 安顺市| 洛阳市| 灵丘县| 金阳县| 莆田市| 封开县|