如何用轻小说的方式学C++(四) 旋转吧雪月花

“明日复明日,明日何其多;我生待明日,万事成蹉跎。”
挺着并不存在的胸,深情朗诵完了这一句后,凛音拿起白板笔歪歪扭扭如同鸡爬地写下了这首古诗。
“那么问题来了——刹那认为我们今天会学什么?”
“呃...不知道?”
“今日课题:循环。”
“吾徒刹那哟,你认为一个循环需要有哪些成分?”
“诶?什么叫哪些成分?”
“就是一个循环必要的组成部分啊?”
“唔...比如说,要有一个循环执行的代码?然后需要有一个判断退出的条件?”
“很好。那么,这就引出了我们今天第一个要学的东西。”
while(expression) {
//todo
}
“expression代表的是一个表达式,每次循环之前都会计算一次,除非其值为0跳出循环,否则将一直执行两个大括号内的代码。”
“当然,大括号依旧标志着这是复合语句,所以如果循环内只有一条语句的话可以不加大括号。”
“凛音酱啊,这个两个斜杠加一个...todo?是什么意思?”
凛音如临大敌,大吼道:“TODO可是一个邪恶的字眼。每当你在你的代码中看到它,你就知道又有其他的傻屌程序员甩锅给你,要你干一些こ——んなこと、あ——んなこと这些奇奇怪怪的事情。”
凛音话音还没落,便被久远的纸扇狠狠地拍了几巴掌。
久远接过凛音的话筒(啊咧为什么有话筒?),开始继续讲解:
“没有多少人能够过目不忘,所以人总是倾向于往这种高度复杂的信息里加注释。C艹的注释有两种形式,第一种是两个除法的斜杠 // ,是单行注释;第二种是块注释, /* ... */ 。注意,块注释是不能嵌套的。至于TODO,只是可能因为有些原因没有来得及写,所以先在这里做标记等待日后再说。”
“日后再说~”
啪叽——凛音的头上多了一个包。
“除去上面的这种结构外,有的时候一个循环需要先做一遍后再判断条件,可以用以下的写法:”
do {
/*
TODO
*/
} while(expression);
“看到了!邪恶的字眼!”
“刹那啊你可不要学凛音啊。”
“诶嘿嘿~抱歉了。”
“注意一下这里的while(expression)之后是有分号的,不要漏了。与while相同,只不过是先执行括号内的代码再判断结束条件。当然,大括号也标志着这里是复合语句块,只有一个语句是不需要大括号的,不过没大括号看起来很奇怪就是了。”
“那么,进入今天最后一个语句,for语句。”
“for?英语介词的for?那个介词很烦啊,英语考试填介词我老是填不对。”
“所以和英语没那么大关系拉。”
for(initialization;expression;step) {
// todo
}
for(item : group) {
// todo
}
“第一个for里面有三个表达式,之间用分号隔开;第一个表达式是初始化,第二个表达式是每次循环开始前都要判定的条件表达式,第三个则是每次循环结束以后执行的表达式。”
“这里的配色真不是在映射什么幼儿园吗?”
“律师函警告!”
“我举个简单的例子吧,比如求1到100的和”
“嗯,5050.”
“...那1到987654321的和呢?”
“487730529388812681”
“...你赢了。”
int i,sum;
for(i=1,sum=0;i<=100;i=i+1) {
sum=sum+i;
}
“初始化,给i赋值为1,sum赋值为0,然后只要i<=100就执行这个循环,每次会给i递增1”
(似懂非懂)
“那么刹那你用while写一个吧。”
(手放在键盘上,迟迟没有按下第一个键。)
“想一想整个程序的流程。第一步干啥?”
“初始化。”
“循环执行的条件呢?”
“小于等于100?”
“下个循环开始前要干嘛?”
“递增1?”
int i,sum;
i=1,sum=0;
while(i<=100) {
sum=sum+i;
i=i+1;
}
“同理,显然有个通用的转换方式对应上面的for语句块:”
initialization;
while(expression) {
// todo
step;
}
“久远前辈,那下面那个带冒号的语句是什么呢?”
“这个等迟一点讲数组和容器的时候再说吧。”
“那么,现在进入黑魔法课程。”
“黑...黑魔法?!”
“对,这可是对程序媛而言的不可饶恕咒——goto语句!”
“呜哇!”
“传说中,伏地魔在他的魔法里面使用了2147483647条goto语句以后突然暴毙身亡——”
“等等这个故事好像哪里有点不对?”
label1:
someCodes();
goto label1;
“以上就是大致的语法。在同一个函数内先随便取一个标签名,然后在其他地方用goto就可以了。goto语句可以往回跳也可以往后跳,但是不能跨函数跳。跨函数的话要用其他技术,这个以后再说。”
“看上去挺正常的啊?为什么会是不可饶恕咒呢?”
“那么刹那,请您以后无论怎样的循环都只使用goto试一试。”
“呜哇——我试试吧。”

“久远前辈啊,这代码也还好吧,用了goto以后还挺好的啊?”
“No no no~这不是这么操作的。现在请刹那保存文件等一周以后看吧~那么我们今天就到这里吧——”
“啊对了好孩子要注意一下,goto因为可以回跳所以可以与if等分支条件组成循环结构,但是绝不是说goto就是循环语句哟~那么——”
“那么?”
“今天剩下的时间——”
凛音终于复活,跳了起来:“当然是强化训练啦!”
“诶?莫非是...练习打字?”
“程序员像干那么low的活的人吗?!”
凛音拖来一个白板,踮着脚在白板上用笔歪七扭八地写上“强化训练”后,把笔往背后一抛,一个帅气的转身,然后左脚绊右脚摔在了地上。
久远接过话筒,开始给刹那进行强化。
(你被强化了!快白给!)
“今天的主题——表达式。因为目前学的东西有限,就先讲讲表达式和运算符吧。”
“刹那应该知道每个表达式都是有值的吧。”
“嗯,之前有提到过。”
“那问题1:a=5;的值是多少?”
“是5,先把5赋值给a然后再返回一个5。”
“那么问题2:a=b=5; 呢?”
“唔...先把5给b,然后把b给a?”
“正解~那么问题来了,a=b++;呢?”
“b++?”
“啊啦这个凛音没讲吗...这叫自增运算符,当然可以写c--,这个自减就不额外说了。有两种写法:++c和c++。”
“啊啦!出现了!C++!”
“嘛C++的意思就是在C语言上面的扩展嘛。”
“习语言?”
“呃你不用去管,反正就是个C++的前辈。呃说前辈可能不太恰当,应该算是父亲吧。”
“那母亲呢?”
“知るか?!”
久远咳了几声,有些力不从心地继续说到:“++c和c++在对c的操作上都是给c加一。”
“C++也就是给C加1喽?会不会加的有点少?”
“...”
“啊咧?怒った?”
“怒ってないよ”
“怒った”
“怒ってないよ”
“怒...”
刹那感觉后背冒了冷汗,便没有再继续耍宝下去。
“二者唯一的区别在于,++c是先给c自增然后返回c的值,而c++是先获得c的值以后再给c自增。”
“呜哇感觉很难记住的样子。”
“记不住的话就尽量避免这写喽,如果不是考试的话也没必要立刻就区分开来。而且就单独一句的话,++c和c++的结果是一样的。”
“搜卡~”
“下一道题!a+=b-=5;假设ab初始都是10.”
“呃,先展开右边的b-=5,得出来是5,然后a+=5得出来a是15,所以结束以后返回值15,a是15且b是5?”
“正解!最后一道题!——”
“d=(a=3,b=4,c=a+b); 这个就留做思考题吧~”
“那么我来说一下今天的作业吧!~”
Mission Issued!:
“机巧少女夜夜打算在学园祭上表演‘旋转吧雪月花!’,打算在高潮的‘まわれ’的时候往电脑屏幕上打印一百个まわれ,现请你分别使用for、while以及goto实现。”
(一周以后,刹那看着一周前写的goto程序一脸懵逼)