如何用轻小说的方式学C++(二) 天秤(上)

“呐吾徒哟,100吨棉花和100吨铁哪个更重?”
“这还用说吗,当然是一样重啊。”
刹那侧了侧头,懵逼地看着满怀期待却落空的凛音。旁边的久远则捂着肚子开始笑了起来。
“然而某位师傅最开始似乎不这么认为的,而且她还说一般人肯定都会错(噗哈哈哈哈)”
“闭嘴!”
恼羞成怒的凛音哐叽一声打开了笔记本,喊到:“那么今天写一个比较大小的程序!”
“写一个比较大小的程序所以以后可以先输入100 100,然后得出它们一样重的答案吗?”久远边岔气边说着。
凛音没有理会久远,而是监督着刹那打开了编辑器,看着她敲完了昨天学的代码。
#include<iostream>
int main() {
std::cout<<"Hello, Setsuna"<<std::endl;
return 0;
}
“首先是第一行;第一行是一个宏指令,你可以简单理解为在编译器正式着手看你程序之前,有个叫预处理器的东西会先对你的宏指令进行替换。注意,是替换,不带任何深层分析的替换。”
“以后还会学到其他的宏指令,你先记住 #include 这个宏指令即可。这个指令的意思是,叫系统去找同名的文件,然后啪的一下复制粘贴biubiu地贴在你写#include的这一行这里。”
(这什么拟声词)
“#include后面可以跟单书名号<> 也可以跟双引号 "" ,配对的符号之间写你需要的文件名。两者之间的区别在于,<>只寻找库里的文件,而""寻找你当前文件夹下的文件。”
“这样的文件,我们叫他‘头文件’。”
“头文件?”
刹那摸了摸自己的头,庆幸头并没有被吸到电脑里去变成一个文件。
“嘛毕竟通常都是写在程序一开始的地方,所以叫‘头文件’嘛。”
凛音喝了口水,继续讲解到:“iostream是一个文件,意思是input&output stream,输入输出流。流是某大佬定义的概念,大意就是把所有的东西看成一串,你可以写程序依次一块一块处理。”
(侧头,不解)
“总而言之就是负责读黑框框里面的东西和往黑框框上面打东西的!”
旁边的久远吃了一块炸鸡,嘟嘟哝哝地抱怨你这样说明谁听得懂。
“食物,没收!!!”
“那么,第一行的#include<iostream>讲完了。就是在库里面找一个叫iostream主要负责输入输出的文件,并且啪地贴到你代码的开头。”
刹那思考了一下,说到:“就是调库而已?”
“初学者就这么理解吧,反正初学者基本次次都会写上的。基本以后你一想用什么系统提供的东西,都需要检查一下看看相应的‘头文件’你是否写在了开头。没写,到时候编译器看到你用的东西会很迷惑不知道是什么,但是写上了以后因为对应的头文件会贴在你程序的开头,所以机器会提前看到你用的东西。”
“就是用别人写过的代码嘛,我知道。”
“那么下一行代码。”
“虽说我很不想把它称之为‘函数’,但是很多翻译都这么翻译的所以算了。比起Function我更倾向于Procedure。”
(???)
“就相当于你把一些要干的事情集中在一块,然后宏观上面抽象一下而已。”
“呃那个...我更迷糊了。”
“那我问你,把一个大象关进冰箱里面要几步?”
“哦那个经典的脑筋急转弯吗?3步啊,打开冰箱门,把大象塞进去,关上冰箱门。”
“没错,程序可以是长这个样子:”
void pushElephantIntoFridge() {
openFridgeDoor();
pushElephant();
closeFridgeDoor();
}
“那么我接着问,把长颈鹿塞进冰箱门要几步?”
“4步啊,打开门,把大象拿出来,长颈鹿塞进去,关门。”
“很好。示例程序我也不写了。我再问一个问题,丛林开运动会,有谁没参加?”
“大象和长颈鹿啊,一个冻感冒了一个还在冰箱里。”
“Bingo~你应该注意到了,因为第一问影响了冰箱的状态,所以第二问的结果和第一问不径相同吧。第三问则更有影响了。”
“的确。”
“数学上的‘函数’是纯函数,也就是输入值一样输出值就一样。而计算机里面更倾向于过程,相同的过程但是因为之前的操作影响了很多东西,所以体现出来的东西也不太相同。”
“那么,让我们进入编程的一大重点概念:‘过程’吧!”
“吾徒刹那哟,你还记得一个简单的CPU模型能干哪几类事情吗?”
“呃...计算,访存,分支跳转,以及其他?”
“差不多。因为寄存器小而快,内存大而慢,所以计算通常是计算寄存器里存的数值,访存则是内存与寄存器之间的数据交换,可存可取;最后一个分支跳转则代表可以根据数据以及计算结果来动态决定执行哪些代码,可谓核心之一。”
“比如刹那,你现在要计算1+2+3+...+100,应该怎么办?”
“直接输出5050就可以了啊。”
被弹了额头。
“那1+2+3+...+n呢?”
“那输出n*(n+1)/2.”
“那输出平方和?”
“平方和公式没背。”
凛音拿出纸扇狠狠地扇在了刹那的脑瓜子上。“就不能用其他办法吗?”
“呃...比如写个流程图?算1加1,算2加2,每次都判断一下是不是已经加到了n?”
“大致是这个想法。这其实就是一个过程了。”
久远在旁边边泡杯面边抱怨到:“哟呵语法都还没讲就开始讲算法了?”
啊好香。
久远:“别想了没多的了。”
凛音:“这样啊,那我和刹那酱分了没你的份了。”
久远:“诶?!啊拿回来啊!!”
凛音指了指开水壶:“人类的一大文明就是抽象思考。比方说,倒水是一个过程,那么所有需要水的时候是不是都可以拿起水壶执行‘倒水’这个动作了呢?”
“所以凛音酱想说什么?”
“比方说现在全班40人每人都要泡面,然后你写代码让机器人给每个人倒水,你是写40次‘倒水’还是写1次倒水然后再循环叫它干40次呢?”
“感觉没差啊?”
“假设‘倒水’写起来非常复杂?倒水这么多笔画,循环你只需要画个箭头写个x40?”
“那肯定是循环叫它干40次啊。”
“没错,这就是‘过程’的核心——把相同的逻辑放在一起。”
“画个箭头计算机就能理解了?”
“不要在意这些细节~”
凛音和刹那很快解决掉了泡面,把悲痛欲绝地说着“那可是限定版蛋黄酱口味的呜呜呜”的久远晒在了一边。
“在所有的过程中,有个过程是老大,它的名字叫main。”
“mian?刚才我们吃的不是面吗?”
らららラーメン、大好き、セツナさん~
“main!就想着吃!main代表着入口点。程序从这里开始执行(虽然这句话严格意义上讲不对不过改正是以后的事情了),一切从这里开始。”
“因为现在的程序比较简单,所以就一个过程就行了。”
“还请注意一下main过程的写法。再写成mian的话下次抢久远桑的泡面就不分给你吃了。”
久远:“诶还要抢老娘的泡面?!”
int main() {
}
凛音拍了拍白板。“int表示整数,整个单词是integer,表示这个过程返回一个整数。”
刹那侧头:“返回?”
凛音:“学过函数吧。y=2x。”
刹那:“这是个线性函数?”
凛音:“我输入1总该出个2吧?”
刹那:(恍然大悟然后思索)“你之前写的推冰箱的void是什么意思?”
凛音:“void意即虚空,表示没有要返回的数据。比方说你干一系列事情干完就完了也没有什么要额外汇报的。”
刹那:“那出问题了呢?”
凛音:“就你事多!”
刹那:“那一个程序执行完了也不需要汇报什么吧,为什么返回值是int?”
凛音:“你这个返回值是给操作系统或者父程序看的,也就是别的程序可以通过你main函数返回值来判断你的运行状况,所以有用的。”
刹那:(似懂非懂)
凛音:“总之你把它当固定搭配记吧!”
出现了!英语老师的大杀器——固定搭配!
“int后面跟着的main是过程名,表示这个过程叫main。”
“面~(流口水)”
咚——
刹那委屈地捂着头上的包。
“main后面跟着两个小括号,注意是半角,编程里面全用半角!不要开着输入法编程!两个小括号里面写参数,因为main过程用不到(以后会用到再说)所以没有参数,空着不写就行。最后跟一对半角大括号。”
“参数?”
“y=2x。”
“我懂了,x是参数吧。”
“流石吾徒。”
“接下来是这一行:”
std::cout<<"Hello, Setsuna"<<std::endl;
“这一块解释起来会很复杂,因为涉及到相 —— 当多的东西。”
“我先讲一下std吧。我先问个问题,假设有100个人一起写一个程序,然后不是要给变量命名嘛。”
点头。
“那100个人能保证取的名字都不一样吗?”
“唔...不提前沟通的话难吧,但是至少可以比如把自己的名字写在变量名之前?比如 刹那_变量1 和 凛音_变量1 之类的?”
“很好,吾徒已经明白了。‘命名空间’就是在说这样的事。”
“哦哦!!也就是说,库的开发者把所有的东西加了 std 这个前缀,所以别人写代码就不会重名了?”
“不错,今天结束了我请饮料。”
“诶嘿嘿~”
“std是standard的缩写。意即标准库。cout则是console out的合并简写,表示控制台输出。至于为什么用<<这个奇怪的符号..还真劳烦先死记吧,这是后面的内容了。你可以在后面串起来写很多个<<也没人管,然后用""括起来你想写的内容就可以了。最后这个std::endl是换行,比较好理解,记住就行。”
“那么接下来就是这个 return 0; 了。字面意思,过程结束,返回值0,表示程序正常运行。”
哆咪来嗦,嗦来咪哆——
完全放学铃打响了。
久远:“看来刹那的天平还没写出来呢。凛音回去不买菜吧?别被人忽悠了。”
凛音:“要你管!”