摘要:本文是我個(gè)人對(duì)C++語言的認(rèn)識(shí)和看法候味,以及以后在學(xué)習(xí)C++語言中自己要去遵守的一些規(guī)范和學(xué)習(xí)思路盅安,提出了一個(gè)關(guān)于定義main函數(shù)及其返回值的討論和解答。
這個(gè)學(xué)期開了C++還有單片機(jī),想再加強(qiáng)一下C/C++語言嚣伐,畢竟以后除了漢語和英語還得多掌握幾門語言。近期的目標(biāo)是復(fù)習(xí)C語言/匯編語言萍丐,學(xué)習(xí)C++語言轩端,也許matlab語言也得學(xué)習(xí)一下。
買了一本參考書《C Primer Plus 》(中文第五版)逝变,借了兩本參考書《程序設(shè)計(jì)基礎(chǔ)》(吳文虎)和《 C++ Primer 》(第五版)基茵,現(xiàn)在看起來《程序設(shè)計(jì)基礎(chǔ)》這本書是非常不錯(cuò)的奋构,主要針對(duì)是的算法,穿插著C++的語法知識(shí)拱层,看了幾章感覺有點(diǎn)漸入佳境的感覺弥臼,還訓(xùn)練了一下邏輯思維,在此推薦一下根灯。
第一篇C++學(xué)習(xí)筆記径缅,先說一些前期的東西,主要是我的學(xué)習(xí)思路和其他的外部準(zhǔn)備烙肺。
我是電氣工程及其自動(dòng)化專業(yè)的學(xué)生纳猪,以后大概不會(huì)以coding為生,但是現(xiàn)在在我看來茬高,現(xiàn)在c/c++作為一種編程語言兆旬,能在以后的工作中提供很大的幫助,比如51需要用C51編程怎栽,ARM架構(gòu)的K60也需要C語言丽猬,以后的DSP也需要(?大概是匯編)熏瞄,還比如最近學(xué)的《電力系統(tǒng)分析》中「潮流計(jì)算」計(jì)算機(jī)算法的實(shí)現(xiàn)脚祟,所以把C語言基本的語法、用法掌握强饮,做到能看懂由桌,以后會(huì)用,養(yǎng)成好的習(xí)慣邮丰,為以后工作打好基礎(chǔ)行您。以上是基礎(chǔ),但通過電子設(shè)計(jì)大賽明白剪廉,對(duì)于「自動(dòng)化」的核心就是控制娃循,控制需要算法來實(shí)現(xiàn),算法是框架斗蒋,沒有框架的話其他的都是空談捌斧,所以更要注重算法的學(xué)習(xí),在構(gòu)建起算法的基礎(chǔ)上泉沾,用編程實(shí)現(xiàn)捞蚂,這才是我的最終目標(biāo),編程是為了完成任務(wù)跷究。比如借的這本《程序設(shè)計(jì)基礎(chǔ)》上姓迅,有很多算法,使我大大拓寬了眼界,實(shí)在是受益匪淺队贱。
?思路(構(gòu)建(數(shù)學(xué))模型) --》 算法 --》編程構(gòu)思 --》程序?qū)崿F(xiàn)
既然開始了編程色冀,那就很可能不是一個(gè)人的事情潭袱,所以一要遵循標(biāo)準(zhǔn)柱嫌,二要有可讀性。先說標(biāo)準(zhǔn)的問題:C/C++的標(biāo)準(zhǔn)屯换,C最新的ISO標(biāo)準(zhǔn)是C99编丘,C++最新的ISO標(biāo)準(zhǔn)是C++14,使用最新的標(biāo)準(zhǔn)不一定是最好的彤悔,但是起碼不要使用20年前的C89的標(biāo)準(zhǔn)凹巫ァ(比如現(xiàn)行很多高校的教材)。
遵循標(biāo)準(zhǔn)晕窑,總是沒錯(cuò)的抑片。就像現(xiàn)在大三開的專業(yè)課,很多行業(yè)標(biāo)準(zhǔn)是需要嚴(yán)格遵守的(比如電氣行業(yè)的DL標(biāo)準(zhǔn))杨赤,不能按照自己的想法敞斋,而是要遵循官方的、最新的行業(yè)規(guī)范來辦事疾牲。
我的集成開發(fā)環(huán)境選擇了VS2013community植捎,但是據(jù)說對(duì)C99支持不好,但是對(duì)C++11支持較好阳柔,有機(jī)會(huì)的話再用更好用的開發(fā)環(huán)境吧焰枢,目前剛起步,夠用就好舌剂。
2015/10/6 起使用Dev-C++ 5.11版本很好用济锄。
談了這么多空話,為什么要遵循標(biāo)準(zhǔn)呢霍转?看下面這個(gè)例子:
所有的C程序都離不開主函數(shù)(main)荐绝,但是現(xiàn)在我用過的課本都是這樣寫的
?void main(){ /* */}
如果寫完程序,程序沒有問題的話谴忧,編譯運(yùn)行是不會(huì)報(bào)錯(cuò)的(但是在Dev-C++會(huì)報(bào)錯(cuò))很泊。
但是,去看最新的C99標(biāo)準(zhǔn):
標(biāo)準(zhǔn)要求的是:
int main() {/* */}or int main(int argc, char *argv[]){/* */}
并且在main函數(shù)的最后需要加一句 return 0;
在《C++ primer》中第一章也提到了:
main函數(shù)的返回類型必須為int沾谓,即整數(shù)類型委造。int類型是一種內(nèi)置類型(build-intpye),即語言自身定義的類型均驶。
為什么要用int型呢昏兆,而且返回?cái)?shù)呢?我不知道妇穴,我去百度爬虱,
那么看一下CSDN上高手的討論吧:
?假設(shè)用戶的命令由command執(zhí)行,首先command把程序加入內(nèi)存,然后設(shè)置CPU的CS:IP指向程序的第一條指令(也就是程序入口,在C++中就是main()函數(shù)),從而使程序得以運(yùn)行.程序結(jié)束后,返回到command中,CPU繼續(xù)運(yùn)行command.注意在返回的時(shí)候要有一個(gè)返回值,這樣才能安全退出程序(注意我用的是退出一詞),之后各寄存器會(huì)有恢復(fù)動(dòng)作,如果沒有返回值,雖然表面上看程序也正常結(jié)束了,但實(shí)際上它并沒有退出,各寄存器并沒有恢復(fù),如CS:IP 還是指向程序尾部,如果得到CS:IP,那么可以讓程序繼續(xù)執(zhí)行下去,但是所執(zhí)行的程序已經(jīng)不是你的代碼所在的那段內(nèi)存空間了,它在執(zhí)行其它內(nèi)存中的程序隶债。
?main 函數(shù)的返回值類型必須是 int ,這樣返回值才能傳遞給程序的激活者(如操作系統(tǒng))跑筝。
也許一直用之前熟悉的套路死讹,也許不問個(gè)為什么,一直會(huì)錯(cuò)下去曲梗,到最后debug都不知道哪里出現(xiàn)錯(cuò)誤赞警。如果一開始就使用標(biāo)準(zhǔn)的話,起碼不會(huì)走彎路虏两。
當(dāng)然愧旦,閱讀幾百頁的ISO標(biāo)準(zhǔn)是非常頭疼的事,不過每次當(dāng)新的標(biāo)準(zhǔn)發(fā)布時(shí)定罢,看高手給出的update分析還是必須的(其實(shí)我就看過C89和C99的不同笤虫,還沒看完……)。
PS:不過如果編譯器不支持最新的標(biāo)準(zhǔn)好像也很無語祖凫,尤其是以后要面對(duì)工業(yè)環(huán)境琼蚯、嵌入式的開發(fā)(比如給8051編程的Keil C51,是不支持c99標(biāo)準(zhǔn)的蝙场,但好像IAR就支持的挺好)凌停,都是古老的集成開發(fā)環(huán)境,不會(huì)追求最新的標(biāo)準(zhǔn)售滤,這些環(huán)境的要求就是穩(wěn)定罚拟,穩(wěn)定壓倒一切!所以是有點(diǎn)糾結(jié)的完箩,新的東西肯定是為了用著更順手赐俗,當(dāng)習(xí)慣了一個(gè)方面快捷的標(biāo)準(zhǔn),再去使用舊的不順手的編寫環(huán)境弊知,內(nèi)心一定是崩潰的阻逮,但必須適應(yīng)。但目前來說拋棄VC++6.0是必須的秩彤,因?yàn)樗踔吝Bwin8.1都不支持叔扼!使用新的編譯器,學(xué)習(xí)一個(gè)新的集成開發(fā)環(huán)境漫雷,也會(huì)是一個(gè)非常有趣的事瓜富!
可以看到在IAR for ARM里的project option里 c dialect里有對(duì)C99的支持,還有VLA(Variable Length Array可變長(zhǎng)度數(shù)組)降盹。
標(biāo)準(zhǔn)都可以在ISO網(wǎng)站上查詢到与柑!
說完標(biāo)準(zhǔn)問題,說說我對(duì)可讀性的理解:
在《程序設(shè)計(jì)基礎(chǔ)》中,吳文虎老師提到:
程序是給人編的价捧,讓人家看懂是第一位重要的事丑念。特別是將來的你可能參加一個(gè)團(tuán)隊(duì),幾十人甚至幾百人一起合作结蟋,相互協(xié)同脯倚,就更須將注釋寫的清清楚楚了。
說的特別好椎眯,尤其是對(duì)于剛剛上路的我挠将,添加了注釋也是為自己一路點(diǎn)燈,要不然起了一堆亂七八糟的變量编整,不知道有什么用,很痛苦乳丰。寫了一堆代碼掌测,不知道要干什么,也很痛苦产园。所以走一步點(diǎn)一盞燈汞斧,要不對(duì)于剛起步的菜雞,容易迷路什燕。當(dāng)然也像吳老師說的那樣粘勒,對(duì)于別人來說更是一件方便的事,當(dāng)有了注釋屎即,更容易明白一個(gè)人思路庙睡。看到別人的代碼是整齊的技俐,起碼才有了想讀下去的沖動(dòng)乘陪,要是寫的亂七八糟,一點(diǎn)想看的欲望都沒有(這好像高中的語文/數(shù)學(xué)/英語/等科目的卷面分暗窭蕖7纫亍)。
代碼整齊在VS2013里很智能井赌,每一行的結(jié)束打上分號(hào)就會(huì)自動(dòng)對(duì)齊谤逼。但VC++6.0就沒這么好了,而且coding界面也不是很友好仇穗。VS2013雖然復(fù)雜流部,可是會(huì)很及時(shí)的提醒你一些語法上的錯(cuò)誤,這樣對(duì)于我這樣的新手仪缸,更是一個(gè)再好不過的事啦贵涵!
嘮叨了這么多,自己也煩了。但是工欲善其事宾茂,必先利其器瓷马,當(dāng)大體的思路和目標(biāo)在腦袋里形成,那么只需一步一步來就好跨晴。下面欧聘,就要真正的開始了!
參考資料:
關(guān)于C99與C89的不同:http://blog.csdn.net/leixiaohua1020/article/details/12761053
main函數(shù)返回值類型的討論:http://bbs.csdn.net/topics/200039113
ISO官網(wǎng):http://www.iso.org/iso/home.html