计算机入门
刚学计算机会遇到各种问题,比如老师讲的让人云里雾里,想入门却发现这个门很抽象,哪怕是最简单的输出hello world的代码 ,初学者也会疑惑为什么要编译,为什么要有int main() 为什么要有return 0 为什么要有#include(stdio.h)..... 本文记录下自己是怎么理解这个代码的每个部分的。
为什么要用编译器写代码?
作为持续性摆烂,偶然性努力的再一次入门计算机的萌新,入门计算机最初的疑惑是为什么写代码要用一个叫编译器的东西写,编译器是干啥的?为什么要用编译器?以下我来举个例子解释这个问题。
首先不同语种的人类互相使用(使唤去干活),主要靠的是说话+翻译者来传递信息,想让一个人做事,得靠嘴巴告诉翻译者内容,再由翻译者翻译内容说给被指挥的人,这里涉及到三个个东西:
1.你发声的工具(嗓子);
2.你说话的语言(比如汉语);
3.翻译者;
接下来我会通俗解释,人类使唤计算机做事用的上边俩条分别是什么。
1.键盘,鼠标等设备(发声工具)
如果你直接对着一个计算机大喊,给我打印hello world,由于计算机没有这种耳朵,也不会懂你说的话,也就不会执行你的命令,显然通过嗓子直接交流是行不通的,于是我们通过特别手段与计算机互动,例如通过键盘和鼠标等设备,实现计算机操作的设备,它们本质是给计算机输入信息的工具,所以也被称做输入设备,输入的英语单词是input ,首字母为i(后面会再提及),计算机有个概念是“i/o设备”,其中的i指的就是input(输入),另一个o指的是output,意思是输出(计算机按照指令回应你)。总之,有了键盘鼠标等输入设备,你才能给计算机下命令。
2.机器语言(语言)
有了给计算机说话的工具后,要解决的下一个问题是该给计算机说什么话,计算机好比一个外国人,你给他讲汉语,他也听不懂啥意思,因为你俩用的语言不互通。计算机和人类也是这样。
我们玩的是汉语,那计算机玩的是啥呢?就俩,1和0,因为物理限制,计算机只管这俩字,这时又有问题了,人类之间能互相交流靠的是丰富的词汇库,有不同的文字表达不同的意思。只靠0和1俩数字怎么做到表达丰富的意思呢?
我们拿英语作文举例,英语看起来是成千上万个单词,但也可以用27个符号来解释(26个字母和空格),任何的英语作文都可以用这27个符号表达出来(标点符号没算),我们可以再简化一下,让任何作文的含义可以用数字来表示:比如给a替换为1、给b替换为2......给z替换为26、把空格替换为27,这样一篇作文就这样被“加密”成了一堆数字,却任然能被解读出原来的意思,此时作文已经被改的面目全非,可这种地步的作文交给只会0和1的人还是看不懂作文,所以还需要进一步的“转化”。
我们把现在全是数字的作文里的所有数字再做一次替换,把1改成1,、把2改成11、把3改成111...把26改成11111111111111111111111111(26个1)、空格改成27个1,最后再用数字0来隔开这一串串的数字1防止混在一起认不了。这样下来作文最终改成了只有1和0俩个东西,最初作文里的it 被改成了111111111011111111111111111111(实际在计算机中代表的不是这个意思,这里只是举例),这样一通操作下来让只会0和1的人就能了解作文的内容。
以上的例子解释了俩个东西:
0和1排列组合可以表示任何复杂的东西,这解决了“词汇贫乏”的问题。
把复杂的东西转化为0和1,会变的很长很长,本来一篇几行的作文,改成数字0和1后可能变成了几十行。这对于计算机来说只是个小问题,毕竟算力可是远超人类的,但对于人类来来说,这样交流效率太低了(算个1+1等于几可能要一堆0和1来表示)。而且还得一直查字典数数字。
为了解决机器早早完工,人类却在半天写命令的问题,人类想到了使用翻译者来解决这个问题。
3.编译(翻译者)
还是回到英语作文的例子,为了让只会0和1的人理解作文内容实在是费劲,于是人类把作文转化为数字的这一步交给了别人去做,让别人帮自己把作文内容转化为0和1交给计算机,那这个角色谁来当呢?没错,编译器就是为了干这事来的,你只管把敲好的你好世界送给编译器,剩下的交给编译器,用人规定的语法转化为0和1让机器理解。到此也就解释了老师说的运行代码前要编译一下的意思,指的就是让编译器转化语言。此时的作文就是所谓的高级语言(因为语法是外国人发明的,所以贴近英语)。
你敲代码让机器打印“你好世界”’的流程如下:
1.用高级语言敲出代码;
2.编译器编译为机器语言;
3.执行机器语言打印你好世界。
以上就是为什么要用编译器写代码。
怎么理解计算机入门的第一个代码(c语言):你好世界
先上代码:
#include<stdio.h>
int main()
{
printf("hello world");
return 0;
}
输出结果是hello world,如图所示:
老师可能会说include main return等等是啥别管,结果简单的几行代码有大半是不明所以。导致入门的时候就感到无形的压力,第一步就一堆不懂,自然打击后面的学习积极性,本人也是很晚才了解他们的意思。下面我来解释这些部分是什么。
1.printf(“hello world”);
先从简单的第4行代码 printf("hello world");讲起,从数学开始讲:
数学里有函数这个东西,大概模样长这样:f(x)= y ,意思是进去x得到结果y,把这个东西分成三部分分别是 f()、x 、 y。以下解释这三个东西。
f()中的 f 是function的首字母,翻译过来是函数的意思,f 后边跟着一个括号,里面用来放打算处理的东西,处理完后输出一个结果,比如把 x 扔给函数,就会有对应的 y 处理出来。这里我们不要把x和y仅仅局限于普通的数字,我们可以把他的范围进行扩大,比如把f()想象成磨坊,x想象成小麦放到磨坊去(放括号),那y就是经过f处理得到的面粉。当然,世界上有不同的函数,我们需要用起名字的办法来区别这些东西,比如磨坊,学校,工厂等等名字。
回到代码的printf(“hello world”);他也可以分成几个部分,printf()、“hello world”、和;,
这里的“;”是一个句子的结束标志,类似汉语中的句号。printf可以继续分为print 和 f 俩部分 ,
print的中文意思是打印,f是函数的缩写,合起来就是打印函数,其中打印是这个函数的名字,
顾名思义,这个函数的任务就是打印;然后是括号里的内容“hello world” 他就是交给函数要处理的东西,合起来的中文意思就是:打印hello world。
看起来有这行代码就够了,那其他几行是干啥的呢?接下来我们讲讲最开头的那一行是啥意思。
2. #include<stdio.h>
同样,我们先把这段东西拆成几个部分来看:# 、include <> 、stdio.h
首先是#,我们可以把这个标志理解为事先申明,中文翻译过来大概是: 注:xxxxxx 。比如在视频开头加的一句话 注:本视频无不良引导 或者是 注:视频内容为特效,别当真。知道#后我们再来看看他申明了啥东西。
接下来是include<> , include的中文意思是包含,括号里代表包含的东西。include<>和#结合起来意思是: 注:本代码包含xxxxx;
那么包含的具体是啥东西呢?stdio.h 是啥,先分解并翻译这些字母:std --> standard(标准),io --> input(输入) output(输出) ,.h --> .head(头),
先解释.h怎么理解,他代表的是文件类别为head ,举俩个的熟悉例子 : .jpg 是图片类型
.mp4 是视频类型;然后解释stdio,他是文件的名称,意思是标准输入输出。和后面的.h合起来意思是 : 标准输入输出文件,文件类别为head(头)文件 ,至于为什么类型名字是head,因为他往往写在代码的开头,所以是头文件。
那么#include<stdio.h> 合起来的意思也就能理解了,可以翻译为 注意:本代码包含名叫标准输入输出的头文件。
问题来了,我们的代码哪里包含标准输入输出了?还记得代码第4行的printf()吗,他就是一个标准的输出函数,负责输出内容,我们用到了这个函数,所以我们要在代码第一行申明我们的代码包含标准输入输出,我们用到的 printf() 是头文件(stdio.h)里的东西。
现在搞明白了俩行东西了,那剩下那四行是啥呢?这四行我将一起讲解。
3. main函数
main后边跟着一个(),main()其实本身就是函数,函数名字是main,main翻译为中文是 “主要 ” ,带()意思是主要函数,他代表代码的开始,不管你的代码是做什么的,执行的起点位置都是main函数,而后面的大括号包含的是main函数的执行内容,里面描述了这个函数要干什么。那么问题来了,前面数学讲函数不是有x和y吗,怎么好像没有?
先说为啥没x(括号里是空的),因为函数产出一个东西不一定需要给他投喂什么东西,比如
f() = 0 这个函数,意思是啥也不用给凭空输出结果0。
再说为啥没y,y其实是存在的,不过是写在了第五行 : return 0; ,return 的意思是返回,也可以理解为输出。return 0 的意思是返回 0 或者说输出 0 ;对于使用者来说输出0没有什么意义,只是因为main他是一个主函数,我们要用它作为代码执行的起点,不然机器不知道从哪开始执行,由于他本质是个函数,所以总得让输出点啥,于是就让他输出一下0意思意思。不过,到输出0的这一步,也代表着代码执行完毕了,最后0去了哪里?没人用到它, 刚出来代码执行就结束了,这个0转瞬即逝。
还差最后一个int ,它写在main的前面 ,int是整形(整数)的意思 ,可以理解为形容词,用来形容main这个函数输出的东西是整数。意义是main是个函数,得表明一下输出什么东西,只是意思意思,让编译器满意。
总结:main是函数名,意思是主函数,是整个代码执行的起点,在函数完成return(输出)后,程序也就结束了。大括号用来包裹主函数要做的事情,int形容函数最后输出的是整数。
4.总结:怎么理解这6行代码
第一行事先申明:本代码包含标准输入输出 ,第二行程序起点(main函数)开始执行任务,第三行大括号负责括住main函数内容,第四行执行 printf 函数打印文字(公屏亮出hello world),第五行return整数0,main函数执行完毕,程序结束。
题外话:
作为一个大学摆烂人,毕业了才发现自己原来还是喜欢计算机,我重新开始学计算机以弥补自己摆烂的遗憾,学习不行会让自己没有自信,进而什么事情都不敢干,不敢做,整天会很压抑。
当初刚学c语言的时候只是第一节课就把我劝退了,简单的打印 hello world ,因为6行代码我只知道printf(“hello world”);的含义,其他的老师都说不用管,这让我误以为代码是个玄学,和某些学科一样是那种只管记住就好了,不要管为什么。老师说学计算机要勤动手,我也给理解错了,在那跟着课本一个字符一个字符的敲,但连代码的含义都没弄会就照着敲只是在练打字而已,很快我就开始怀疑我是不是真的喜欢计算机,这让我学习兴趣大减,以致于大一c语言直接摆了。后面因为c没学好,数据结构 算法 其他语言等更是难听懂(字符是啥意思都不知道)更确信自己学不了这个课,听课像听英语课,越尝试,越听不懂,越感觉莫名其妙,越放弃。最后一直也没意识到是c语言基础烂导致步步错。基础没打好,后面的很多课都成了记住就好,都是应付考试学(记住)俩天。之后的断断续续的学习,有点像走路没学会,试图模仿各种跑步姿势,发现不行。
毕业以后,自己没学会东西只会一直没自信,一直焦虑,终于实在受不了了,必须好好搞,从头开始系统的学习,结果发现,入门到hello world搞定后,计算机不难。才发现自己当年有多傻,为啥不自己找着资料从头学呢?这么有意思的东西毕业才知道,太难受了。习惯了高中时期天天给人讲题的快感,当四年学渣才知道,有路可以走,却找不到路的悲哀。
至于学习计划,我也不在意每周花多少时间学,我喜欢我可以想学就学,至于为什么现在学起这个,因为知识真的能带来自信,填满自己的虚空,也不用说为了某个宏大的目标去学,做好自己目前的事,减少遗憾,不用在学基础的时候,就急着想象自己是个游戏开发大师,找着教程跟着速学了。不积跬步无以至千里,走捷径的最后还是缝缝补补,还不如原来的路快,基础学好前先放下那些急躁。