如何用輕小說(shuō)的方式學(xué)C++(四) 旋轉(zhuǎn)吧雪月花

“明日復(fù)明日,明日何其多;我生待明日,萬(wàn)事成蹉跎?!?/p>
挺著并不存在的胸,深情朗誦完了這一句后,凜音拿起白板筆歪歪扭扭如同雞爬地寫下了這首古詩(shī)。
“那么問(wèn)題來(lái)了——?jiǎng)x那認(rèn)為我們今天會(huì)學(xué)什么?”
“呃...不知道?”
“今日課題:循環(huán)?!?/p>
“吾徒剎那喲,你認(rèn)為一個(gè)循環(huán)需要有哪些成分?”
“誒?什么叫哪些成分?”
“就是一個(gè)循環(huán)必要的組成部分?。俊?/p>
“唔...比如說(shuō),要有一個(gè)循環(huán)執(zhí)行的代碼?然后需要有一個(gè)判斷退出的條件?”
“很好。那么,這就引出了我們今天第一個(gè)要學(xué)的東西?!?/p>
while(expression) {
????//todo
}
“expression代表的是一個(gè)表達(dá)式,每次循環(huán)之前都會(huì)計(jì)算一次,除非其值為0跳出循環(huán),否則將一直執(zhí)行兩個(gè)大括號(hào)內(nèi)的代碼?!?/p>
“當(dāng)然,大括號(hào)依舊標(biāo)志著這是復(fù)合語(yǔ)句,所以如果循環(huán)內(nèi)只有一條語(yǔ)句的話可以不加大括號(hào)?!?/p>
“凜音醬啊,這個(gè)兩個(gè)斜杠加一個(gè)...todo?是什么意思?”
凜音如臨大敵,大吼道:“TODO可是一個(gè)邪惡的字眼。每當(dāng)你在你的代碼中看到它,你就知道又有其他的傻屌程序員甩鍋給你,要你干一些こ——んなこと、あ——んなこと這些奇奇怪怪的事情?!?/p>
凜音話音還沒(méi)落,便被久遠(yuǎn)的紙扇狠狠地拍了幾巴掌。
久遠(yuǎn)接過(guò)凜音的話筒(啊咧為什么有話筒?),開(kāi)始繼續(xù)講解:
“沒(méi)有多少人能夠過(guò)目不忘,所以人總是傾向于往這種高度復(fù)雜的信息里加注釋。C艸的注釋有兩種形式,第一種是兩個(gè)除法的斜杠 // ,是單行注釋;第二種是塊注釋,? /* ... */? ?。注意,塊注釋是不能嵌套的。至于TODO,只是可能因?yàn)橛行┰驔](méi)有來(lái)得及寫,所以先在這里做標(biāo)記等待日后再說(shuō)?!?/p>
“日后再說(shuō)~”
啪嘰——?jiǎng)C音的頭上多了一個(gè)包。
“除去上面的這種結(jié)構(gòu)外,有的時(shí)候一個(gè)循環(huán)需要先做一遍后再判斷條件,可以用以下的寫法:”
do {
/*
????TODO
*/
} while(expression);
“看到了!邪惡的字眼!”
“剎那啊你可不要學(xué)凜音啊?!?/p>
“誒嘿嘿~抱歉了?!?/p>
“注意一下這里的while(expression)之后是有分號(hào)的,不要漏了。與while相同,只不過(guò)是先執(zhí)行括號(hào)內(nèi)的代碼再判斷結(jié)束條件。當(dāng)然,大括號(hào)也標(biāo)志著這里是復(fù)合語(yǔ)句塊,只有一個(gè)語(yǔ)句是不需要大括號(hào)的,不過(guò)沒(méi)大括號(hào)看起來(lái)很奇怪就是了?!?/p>
“那么,進(jìn)入今天最后一個(gè)語(yǔ)句,for語(yǔ)句。”
“for?英語(yǔ)介詞的for?那個(gè)介詞很煩啊,英語(yǔ)考試填介詞我老是填不對(duì)?!?/p>
“所以和英語(yǔ)沒(méi)那么大關(guān)系拉?!?/p>
for(initialization;expression;step) {
????// todo
}
for(item : group) {
????// todo
}
“第一個(gè)for里面有三個(gè)表達(dá)式,之間用分號(hào)隔開(kāi);第一個(gè)表達(dá)式是初始化,第二個(gè)表達(dá)式是每次循環(huán)開(kāi)始前都要判定的條件表達(dá)式,第三個(gè)則是每次循環(huán)結(jié)束以后執(zhí)行的表達(dá)式?!?/p>
“這里的配色真不是在映射什么幼兒園嗎?”
“律師函警告!”
“我舉個(gè)簡(jiǎn)單的例子吧,比如求1到100的和”
“嗯,5050.”
“...那1到987654321的和呢?”
“487730529388812681”
“...你贏了?!?/p>
int i,sum;
for(i=1,sum=0;i<=100;i=i+1) {
????sum=sum+i;
}
“初始化,給i賦值為1,sum賦值為0,然后只要i<=100就執(zhí)行這個(gè)循環(huán),每次會(huì)給i遞增1”
(似懂非懂)
“那么剎那你用while寫一個(gè)吧?!?/p>
(手放在鍵盤上,遲遲沒(méi)有按下第一個(gè)鍵。)
“想一想整個(gè)程序的流程。第一步干啥?”
“初始化?!?/p>
“循環(huán)執(zhí)行的條件呢?”
“小于等于100?”
“下個(gè)循環(huán)開(kāi)始前要干嘛?”
“遞增1?”
int i,sum;
i=1,sum=0;
while(i<=100) {
????sum=sum+i;
????i=i+1;
}
“同理,顯然有個(gè)通用的轉(zhuǎn)換方式對(duì)應(yīng)上面的for語(yǔ)句塊:”
initialization;
while(expression) {
????// todo
????step;
}
“久遠(yuǎn)前輩,那下面那個(gè)帶冒號(hào)的語(yǔ)句是什么呢?”
“這個(gè)等遲一點(diǎn)講數(shù)組和容器的時(shí)候再說(shuō)吧。”
“那么,現(xiàn)在進(jìn)入黑魔法課程。”
“黑...黑魔法?!”
“對(duì),這可是對(duì)程序媛而言的不可饒恕咒——goto語(yǔ)句!”
“嗚哇!”
“傳說(shuō)中,伏地魔在他的魔法里面使用了2147483647條goto語(yǔ)句以后突然暴斃身亡——”
“等等這個(gè)故事好像哪里有點(diǎn)不對(duì)?”
label1:
someCodes();
goto label1;
“以上就是大致的語(yǔ)法。在同一個(gè)函數(shù)內(nèi)先隨便取一個(gè)標(biāo)簽名,然后在其他地方用goto就可以了。goto語(yǔ)句可以往回跳也可以往后跳,但是不能跨函數(shù)跳??绾瘮?shù)的話要用其他技術(shù),這個(gè)以后再說(shuō)。”
“看上去挺正常的?。繛槭裁磿?huì)是不可饒恕咒呢?”
“那么剎那,請(qǐng)您以后無(wú)論怎樣的循環(huán)都只使用goto試一試?!?/p>
“嗚哇——我試試吧?!?/p>
“久遠(yuǎn)前輩啊,這代碼也還好吧,用了goto以后還挺好的啊?”
“No no no~這不是這么操作的?,F(xiàn)在請(qǐng)剎那保存文件等一周以后看吧~那么我們今天就到這里吧——”
“啊對(duì)了好孩子要注意一下,goto因?yàn)榭梢曰靥钥梢?span id="s0sssss00s" class="font-size-23">與if等分支條件組成循環(huán)結(jié)構(gòu),但是絕不是說(shuō)goto就是循環(huán)語(yǔ)句喲~那么——”
“那么?”
“今天剩下的時(shí)間——”
凜音終于復(fù)活,跳了起來(lái):“當(dāng)然是強(qiáng)化訓(xùn)練啦!”
“誒?莫非是...練習(xí)打字?”
“程序員像干那么low的活的人嗎?!”
凜音拖來(lái)一個(gè)白板,踮著腳在白板上用筆歪七扭八地寫上“強(qiáng)化訓(xùn)練”后,把筆往背后一拋,一個(gè)帥氣的轉(zhuǎn)身,然后左腳絆右腳摔在了地上。
久遠(yuǎn)接過(guò)話筒,開(kāi)始給剎那進(jìn)行強(qiáng)化。
(你被強(qiáng)化了!快白給?。?/p>
“今天的主題——表達(dá)式。因?yàn)槟壳皩W(xué)的東西有限,就先講講表達(dá)式和運(yùn)算符吧?!?/p>
“剎那應(yīng)該知道每個(gè)表達(dá)式都是有值的吧?!?/p>
“嗯,之前有提到過(guò)?!?/p>
“那問(wèn)題1:a=5;的值是多少?”
“是5,先把5賦值給a然后再返回一個(gè)5?!?/p>
“那么問(wèn)題2:a=b=5; 呢?”
“唔...先把5給b,然后把b給a?”
“正解~那么問(wèn)題來(lái)了,a=b++;呢?”
“b++?”
“啊啦這個(gè)凜音沒(méi)講嗎...這叫自增運(yùn)算符,當(dāng)然可以寫c--,這個(gè)自減就不額外說(shuō)了。有兩種寫法:++c和c++。”
“啊啦!出現(xiàn)了!C++!”
“嘛C++的意思就是在C語(yǔ)言上面的擴(kuò)展嘛?!?/p>
“習(xí)語(yǔ)言?”
“呃你不用去管,反正就是個(gè)C++的前輩。呃說(shuō)前輩可能不太恰當(dāng),應(yīng)該算是父親吧?!?/p>
“那母親呢?”
“知るか?!”
久遠(yuǎn)咳了幾聲,有些力不從心地繼續(xù)說(shuō)到:“++c和c++在對(duì)c的操作上都是給c加一?!?/p>
“C++也就是給C加1嘍?會(huì)不會(huì)加的有點(diǎn)少?”
“...”
“啊咧?怒った?”
“怒ってないよ”
“怒った”
“怒ってないよ”
“怒...”
剎那感覺(jué)后背冒了冷汗,便沒(méi)有再繼續(xù)耍寶下去。
“二者唯一的區(qū)別在于,++c是先給c自增然后返回c的值,而c++是先獲得c的值以后再給c自增?!?/p>
“嗚哇感覺(jué)很難記住的樣子?!?/p>
“記不住的話就盡量避免這寫嘍,如果不是考試的話也沒(méi)必要立刻就區(qū)分開(kāi)來(lái)。而且就單獨(dú)一句的話,++c和c++的結(jié)果是一樣的?!?/p>
“搜卡~”
“下一道題!a+=b-=5;假設(shè)ab初始都是10.”
“呃,先展開(kāi)右邊的b-=5,得出來(lái)是5,然后a+=5得出來(lái)a是15,所以結(jié)束以后返回值15,a是15且b是5?”
“正解!最后一道題!——”
“d=(a=3,b=4,c=a+b); 這個(gè)就留做思考題吧~”
“那么我來(lái)說(shuō)一下今天的作業(yè)吧!~”
Mission Issued?。?/p>
“機(jī)巧少女夜夜打算在學(xué)園祭上表演‘旋轉(zhuǎn)吧雪月花!’,打算在高潮的‘まわれ’的時(shí)候往電腦屏幕上打印一百個(gè)まわれ,現(xiàn)請(qǐng)你分別使用for、while以及goto實(shí)現(xiàn)。”
(一周以后,剎那看著一周前寫的goto程序一臉懵逼)