如何用轻小说的方式学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!:

“机巧少女夜夜打算在学园祭上表演‘旋转吧雪月花!’,打算在高潮的‘まわれ’的时候往电脑屏幕上打印一百个まわれ,现请你分别使用forwhile以及goto实现。”


(一周以后,刹那看着一周前写的goto程序一脸懵逼)

本文为我原创

-- --
  • 投诉或建议
评论