如何用輕小說的方式學(xué)C++(二) 天秤(上)

“吶吾徒喲,100噸棉花和100噸鐵哪個(gè)更重?”
“這還用說嗎,當(dāng)然是一樣重啊?!?/p>
剎那側(cè)了側(cè)頭,懵逼地看著滿懷期待卻落空的凜音。旁邊的久遠(yuǎn)則捂著肚子開始笑了起來。
“然而某位師傅最開始似乎不這么認(rèn)為的,而且她還說一般人肯定都會(huì)錯(cuò)(噗哈哈哈哈)”
“閉嘴!”
惱羞成怒的凜音哐嘰一聲打開了筆記本,喊到:“那么今天寫一個(gè)比較大小的程序!”
“寫一個(gè)比較大小的程序所以以后可以先輸入100 100,然后得出它們一樣重的答案嗎?”久遠(yuǎn)邊岔氣邊說著。
凜音沒有理會(huì)久遠(yuǎn),而是監(jiān)督著剎那打開了編輯器,看著她敲完了昨天學(xué)的代碼。
#include<iostream>
int main() {
????std::cout<<"Hello, Setsuna"<<std::endl;
????return 0;
}
“首先是第一行;第一行是一個(gè)宏指令,你可以簡單理解為在編譯器正式著手看你程序之前,有個(gè)叫預(yù)處理器的東西會(huì)先對(duì)你的宏指令進(jìn)行替換。注意,是替換,不帶任何深層分析的替換?!?/p>
“以后還會(huì)學(xué)到其他的宏指令,你先記住 #include 這個(gè)宏指令即可。這個(gè)指令的意思是,叫系統(tǒng)去找同名的文件,然后啪的一下復(fù)制粘貼biubiu地貼在你寫#include的這一行這里?!?/p>
(這什么擬聲詞)
“#include后面可以跟單書名號(hào)<> 也可以跟雙引號(hào) "" ,配對(duì)的符號(hào)之間寫你需要的文件名。兩者之間的區(qū)別在于,<>只尋找?guī)炖锏奈募?,?#34;"尋找你當(dāng)前文件夾下的文件?!?/p>
“這樣的文件,我們叫他‘頭文件’?!?/p>
“頭文件?”
剎那摸了摸自己的頭,慶幸頭并沒有被吸到電腦里去變成一個(gè)文件。
“嘛畢竟通常都是寫在程序一開始的地方,所以叫‘頭文件’嘛?!?/p>
凜音喝了口水,繼續(xù)講解到:“iostream是一個(gè)文件,意思是input&output stream,輸入輸出流。流是某大佬定義的概念,大意就是把所有的東西看成一串,你可以寫程序依次一塊一塊處理?!?/p>
(側(cè)頭,不解)
“總而言之就是負(fù)責(zé)讀黑框框里面的東西和往黑框框上面打東西的!”
旁邊的久遠(yuǎn)吃了一塊炸雞,嘟嘟噥噥地抱怨你這樣說明誰聽得懂。
“食物,沒收?。?!”
“那么,第一行的#include<iostream>講完了。就是在庫里面找一個(gè)叫iostream主要負(fù)責(zé)輸入輸出的文件,并且啪地貼到你代碼的開頭?!?/p>
剎那思考了一下,說到:“就是調(diào)庫而已?”
“初學(xué)者就這么理解吧,反正初學(xué)者基本次次都會(huì)寫上的?;疽院竽阋幌胗檬裁聪到y(tǒng)提供的東西,都需要檢查一下看看相應(yīng)的‘頭文件’你是否寫在了開頭。沒寫,到時(shí)候編譯器看到你用的東西會(huì)很迷惑不知道是什么,但是寫上了以后因?yàn)閷?duì)應(yīng)的頭文件會(huì)貼在你程序的開頭,所以機(jī)器會(huì)提前看到你用的東西?!?/p>
“就是用別人寫過的代碼嘛,我知道。”
“那么下一行代碼?!?/p>
“雖說我很不想把它稱之為‘函數(shù)’,但是很多翻譯都這么翻譯的所以算了。比起Function我更傾向于Procedure?!?/p>
(???)
“就相當(dāng)于你把一些要干的事情集中在一塊,然后宏觀上面抽象一下而已?!?/p>
“呃那個(gè)...我更迷糊了?!?/p>
“那我問你,把一個(gè)大象關(guān)進(jìn)冰箱里面要幾步?”
“哦那個(gè)經(jīng)典的腦筋急轉(zhuǎn)彎嗎?3步啊,打開冰箱門,把大象塞進(jìn)去,關(guān)上冰箱門?!?/p>
“沒錯(cuò),程序可以是長這個(gè)樣子:”
void pushElephantIntoFridge() {
????openFridgeDoor();
????pushElephant();
????closeFridgeDoor();
}
“那么我接著問,把長頸鹿塞進(jìn)冰箱門要幾步?”
“4步啊,打開門,把大象拿出來,長頸鹿塞進(jìn)去,關(guān)門。”
“很好。示例程序我也不寫了。我再問一個(gè)問題,叢林開運(yùn)動(dòng)會(huì),有誰沒參加?”
“大象和長頸鹿啊,一個(gè)凍感冒了一個(gè)還在冰箱里?!?/p>
“Bingo~你應(yīng)該注意到了,因?yàn)榈谝粏栍绊懥吮涞臓顟B(tài),所以第二問的結(jié)果和第一問不徑相同吧。第三問則更有影響了?!?/p>
“的確?!?/p>
“數(shù)學(xué)上的‘函數(shù)’是純函數(shù),也就是輸入值一樣輸出值就一樣。而計(jì)算機(jī)里面更傾向于過程,相同的過程但是因?yàn)橹暗牟僮饔绊懥撕芏鄸|西,所以體現(xiàn)出來的東西也不太相同?!?/p>
“那么,讓我們進(jìn)入編程的一大重點(diǎn)概念:‘過程’吧!”
“吾徒剎那喲,你還記得一個(gè)簡單的CPU模型能干哪幾類事情嗎?”
“呃...計(jì)算,訪存,分支跳轉(zhuǎn),以及其他?”
“差不多。因?yàn)?strong>寄存器小而快,內(nèi)存大而慢,所以計(jì)算通常是計(jì)算寄存器里存的數(shù)值,訪存則是內(nèi)存與寄存器之間的數(shù)據(jù)交換,可存可??;最后一個(gè)分支跳轉(zhuǎn)則代表可以根據(jù)數(shù)據(jù)以及計(jì)算結(jié)果來動(dòng)態(tài)決定執(zhí)行哪些代碼,可謂核心之一?!?/p>
“比如剎那,你現(xiàn)在要計(jì)算1+2+3+...+100,應(yīng)該怎么辦?”
“直接輸出5050就可以了啊。”
被彈了額頭。
“那1+2+3+...+n呢?”
“那輸出n*(n+1)/2.”
“那輸出平方和?”
“平方和公式?jīng)]背。”
凜音拿出紙扇狠狠地扇在了剎那的腦瓜子上?!熬筒荒苡闷渌k法嗎?”
“呃...比如寫個(gè)流程圖?算1加1,算2加2,每次都判斷一下是不是已經(jīng)加到了n?”
“大致是這個(gè)想法。這其實(shí)就是一個(gè)過程了?!?/p>
久遠(yuǎn)在旁邊邊泡杯面邊抱怨到:“喲呵語法都還沒講就開始講算法了?”
啊好香。
久遠(yuǎn):“別想了沒多的了。”
凜音:“這樣啊,那我和剎那醬分了沒你的份了?!?/p>
久遠(yuǎn):“誒?!啊拿回來?。?!”
凜音指了指開水壺:“人類的一大文明就是抽象思考。比方說,倒水是一個(gè)過程,那么所有需要水的時(shí)候是不是都可以拿起水壺執(zhí)行‘倒水’這個(gè)動(dòng)作了呢?”
“所以凜音醬想說什么?”
“比方說現(xiàn)在全班40人每人都要泡面,然后你寫代碼讓機(jī)器人給每個(gè)人倒水,你是寫40次‘倒水’還是寫1次倒水然后再循環(huán)叫它干40次呢?”
“感覺沒差啊?”
“假設(shè)‘倒水’寫起來非常復(fù)雜?倒水這么多筆畫,循環(huán)你只需要畫個(gè)箭頭寫個(gè)x40?”
“那肯定是循環(huán)叫它干40次啊?!?/p>
“沒錯(cuò),這就是‘過程’的核心——把相同的邏輯放在一起?!?/p>
“畫個(gè)箭頭計(jì)算機(jī)就能理解了?”
“不要在意這些細(xì)節(jié)~”
凜音和剎那很快解決掉了泡面,把悲痛欲絕地說著“那可是限定版蛋黃醬口味的嗚嗚嗚”的久遠(yuǎn)曬在了一邊。
“在所有的過程中,有個(gè)過程是老大,它的名字叫main?!?/p>
“mian?剛才我們吃的不是面嗎?”
らららラーメン、大好き、セツナさん~
“main!就想著吃!main代表著入口點(diǎn)。程序從這里開始執(zhí)行(雖然這句話嚴(yán)格意義上講不對(duì)不過改正是以后的事情了),一切從這里開始?!?/p>
“因?yàn)楝F(xiàn)在的程序比較簡單,所以就一個(gè)過程就行了?!?/p>
“還請(qǐng)注意一下main過程的寫法。再寫成mian的話下次搶久遠(yuǎn)桑的泡面就不分給你吃了?!?/p>
久遠(yuǎn):“誒還要搶老娘的泡面?!”
int main() {
}
凜音拍了拍白板?!癷nt表示整數(shù),整個(gè)單詞是integer,表示這個(gè)過程返回一個(gè)整數(shù)。”
剎那側(cè)頭:“返回?”
凜音:“學(xué)過函數(shù)吧。y=2x?!?/p>
剎那:“這是個(gè)線性函數(shù)?”
凜音:“我輸入1總該出個(gè)2吧?”
剎那:(恍然大悟然后思索)“你之前寫的推冰箱的void是什么意思?”
凜音:“void意即虛空,表示沒有要返回的數(shù)據(jù)。比方說你干一系列事情干完就完了也沒有什么要額外匯報(bào)的。”
剎那:“那出問題了呢?”
凜音:“就你事多!”
剎那:“那一個(gè)程序執(zhí)行完了也不需要匯報(bào)什么吧,為什么返回值是int?”
凜音:“你這個(gè)返回值是給操作系統(tǒng)或者父程序看的,也就是別的程序可以通過你main函數(shù)返回值來判斷你的運(yùn)行狀況,所以有用的?!?/p>
剎那:(似懂非懂)
凜音:“總之你把它當(dāng)固定搭配記吧!”
出現(xiàn)了!英語老師的大殺器——固定搭配!
“int后面跟著的main是過程名,表示這個(gè)過程叫main?!?/p>
“面~(流口水)”
咚——
剎那委屈地捂著頭上的包。
“main后面跟著兩個(gè)小括號(hào),注意是半角,編程里面全用半角!不要開著輸入法編程!兩個(gè)小括號(hào)里面寫參數(shù),因?yàn)閙ain過程用不到(以后會(huì)用到再說)所以沒有參數(shù),空著不寫就行。最后跟一對(duì)半角大括號(hào)?!?/p>
“參數(shù)?”
“y=2x?!?/p>
“我懂了,x是參數(shù)吧。”
“流石吾徒?!?/p>
“接下來是這一行:”
std::cout<<"Hello, Setsuna"<<std::endl;
“這一塊解釋起來會(huì)很復(fù)雜,因?yàn)樯婕暗较?—— 當(dāng)多的東西?!?/p>
“我先講一下std吧。我先問個(gè)問題,假設(shè)有100個(gè)人一起寫一個(gè)程序,然后不是要給變量命名嘛。”
點(diǎn)頭。
“那100個(gè)人能保證取的名字都不一樣嗎?”
“唔...不提前溝通的話難吧,但是至少可以比如把自己的名字寫在變量名之前?比如 剎那_變量1 和 凜音_變量1 之類的?”
“很好,吾徒已經(jīng)明白了?!臻g’就是在說這樣的事。”
“哦哦?。∫簿褪钦f,庫的開發(fā)者把所有的東西加了 std 這個(gè)前綴,所以別人寫代碼就不會(huì)重名了?”
“不錯(cuò),今天結(jié)束了我請(qǐng)飲料?!?/p>
“誒嘿嘿~”
“std是standard的縮寫。意即標(biāo)準(zhǔn)庫。cout則是console out的合并簡寫,表示控制臺(tái)輸出。至于為什么用<<這個(gè)奇怪的符號(hào)..還真勞煩先死記吧,這是后面的內(nèi)容了。你可以在后面串起來寫很多個(gè)<<也沒人管,然后用""括起來你想寫的內(nèi)容就可以了。最后這個(gè)std::endl是換行,比較好理解,記住就行。”
“那么接下來就是這個(gè) return 0; 了。字面意思,過程結(jié)束,返回值0,表示程序正常運(yùn)行?!?/p>
哆咪來嗦,嗦來咪哆——
完全放學(xué)鈴打響了。
久遠(yuǎn):“看來剎那的天平還沒寫出來呢。凜音回去不買菜吧?別被人忽悠了。”
凜音:“要你管!”