这篇文章开始,我会在此记录我预习《C++程序设计教程》的一些所学所想,并用自己的理解来复述一遍自己在课堂上学到的内容。
Part 1 初识计算机结构
在学C++这门计算机语言之前,首先要知道什么是计算机。简单来说,计算机是人们用来解决问题的一样工具,只要用合理的方式将问题告诉它,它就能很快地给出答案,但首先需要我们先造出这样的工具,幸运的是,前人已经为我们铺好了路,有这么一位叫冯诺伊曼的大佬,集合了已有的信息相关设备,创造了一种叫做冯诺伊曼结构的结构(这样说是不是有点奇怪哈哈),如下图:
,
有了这张图就很好理解了,我们把问题告诉计算机的输入设备,经过中间的几个步骤,最后它就能通过输出设备告诉我们答案。在计算机里,被夹在输入、输出中间的几个部件,就是它处理问题和得出答案的地方,它们各自也有其独特的功能。
首先是控制器,它就相当于人的大脑,大脑供血充足,就能指挥全身的活动,计算机也一样,给计算机插上电,控制器就开始指挥其余各个部分开始工作,而且工作的大部分不需要人的参与,要不然怎么说计算机是“电脑”,它解放了人的大脑,人脑只要提供创意,那些繁杂的计算处理,就交给电脑了。
其次,存储器,从字面上看,就知道它是个能够存东西的地方,计算机里存储的,自然是信息了,暂且不说信息是怎么被存起来的,我们只要先知道它们是能像具体的东西一样被放在容器里就行了。这些信息就包括我们前面提到的、人们告诉计算机的问题,另外,还有设计计算机的大佬在造计算机时,教给它的一些解决问题的基本方法。这些由问题、方法之类的组成的信息,就待在存储器里,静静地等着被调用。
上面说存储器只能把信息存着,那么相应地就应该有个部件,它能够用上这些信息,真正地解决问题,这就需要最后一个部件——运算器。运算器,顾名思义,就是做算术的地方,没错,人们的问题是以数据的形式输入计算机的,这些由数据组成的信息先是被安顿好在储存器里,再被运算器调去,经过运算器里的各种加减乘除,乃至更高级的数学运算,最终呈现出作为答案的数据信息,通过输出设备回答问问题的人。
Part 2 计算语言的分类
在第一部分,我们基本认识了计算机内部的大体结构和各部分的功能,为我们介绍计算语言提供了前提。冯诺伊曼结构的开端就是输入设备,它相当于计算机的耳目,可以听到看到我们想告诉它的信息,然后才能进行操作。当然,计算机不可能直接就听懂我们人的话,它也没有学习语言的功能,于是,就只有从我们身上改变了,在前辈大佬的探索之中,计算语言逐渐形成体系,而这计算语言,便是计算机听得懂的话。
总的来说,计算机语言经历了低级语言和高级语言两个阶段,高级语言是基于低级语言近一步发展而来的,而且还在不断发展中,我们先从低级语言开始讲起。
低级语言之所以“低级”,是因为它是面向机器的语言,是针对计算机设计的最基础的人机沟通方法,由于其过于基础,这才被称为“低级”,这里的“低级”表示的是比较底层,比较奠基的意思。
低级语言的发展也经历了两代,先是出现了第一代计算机语言——机器语言,后有了作为第二代计算机语言的汇编语言。机器语言是和机器,也就是计算机硬件关系最为紧密的,因为先有了机器语言,才能根据其设计计算机的硬件,人们利用这种语言给计算机输入的指令,都是由二进制代码表示的,每一条指令都需要严格地输入二进制数字串,虽然这样的指令所构成的程序运行起来速度很快,但也有其弊端,那就是不方便人们编写,那么多的指令需要那么多的0和1来排列组合,鬼才记得下来!而且,一条指令也只能对一种计算机系统有用,给你个不一样的计算机系统,很大概率就运行不了了,这就叫做程序的可移植性差。从这里也可以看出,为什么低级语言是面向机器的语言了,是因为机器喜欢这种语言,干起事来快,而对人们来说就不友好了。
编程者也看到了机器语言的缺点,不太好记,于是他们就发明了对他们来说好记一点的语言,用缩写的英文单词,来代替由一堆二进制数字串组成的指令,帮助编程者更方便地记忆,那些缩写地英文单词就被称为助记符,这些代替指令的助记符合在一起,就叫做汇编语言,“汇”这个字就表示,在设计汇编语言的时候,将一堆1010的二进制数字所代表的指令汇集在一个小小的缩写单词里。那么“编”呢?前面说的“汇”,是汇编语言的产生,那么“编”,自然就是汇编语言的应用了。我们知道,计算机只能看懂二进制代码,要是直接跟它们讲英语,它们是听不懂的,所以将助记符输入计算机后,还需要翻译成计算机能看懂的二进制代码,这个过程虽然叫“汇编”,但我们也可以理解成“编”,汇完后又将指令编回成那些1010的二进制数字,当然,这个过程就可以直接交给计算机的汇编程序自动完成,不然如果又让人来编,那么设计汇编语言又有什么意义呢?
高级语言作为第三代计算机语言,相比于低级语言具有更大的优越性。这个优越性就体现在,低级语言都是面向机器的,主要考虑的是机器能不能听懂人们的话,就算是汇编语言在记忆上更方便了点,但也是对专业的编程者来说的,对于大多数人们并不友好;而高级语言则是面向人的语言,更大程度上考虑人使用计算机语言的方便性,会更容易学习。当然,也不能因此就看不起低级语言了,毕竟低级语言是高级语言的基础,没有低级语言在前面铺路架桥,就没有高级语言的用武之地。人们使用高级语言时,就不用过多考虑计算机能不能理解人们的话了,人们只需要用普普通通的话或者数学式子来描述问题,编写程序,剩下的交给计算机就好了,计算机自带的编译器就可以翻译到位,而且,有了编译器,就使得程序可以在不同的计算机系统里运行,这就说明,高级语言具有良好的可移植性。
说完了祖宗十八代,终于回到了文章的主题,C++。高级语言在发展过程中,被开发出了无数种,而C++就是其中之一,C++中的C表示的是它的前身——C语言,C语言也可以看作C++的基础部分,C++中类似C语言的部分,称为过程性语言,主要关注的是问题的过程步骤,这用到了结构化程序设计方法,简单来说,就是将问题细化成具有很多步骤的链式结构,拆解问题,各个击破;而C++中的“++”则可以理解为C++中,相比C语言更多的内容,这部分内容叫做“类”,采用的是面向对象程序设计方法,这里的面向对象就不表示为人们着想了,而是表示其面向的是一大类问题,这一大类算是一种对象,对于这种问题对象,可以将其拆分为更简单的几个部分,将几个部分的问题排列组合,就是所有的这类问题了,这样的设计方法让人们更方便操作计算机,计算机能使用的场合增多了,使用的便捷性也提高了,这就是“++”。
Part 3 C++程序的基本结构
#include<iostream>
using namespace std;
int main()
{
cout<<"Hello Summerison!"<<endl;
}
上面这个程序是一个简单的C++程序,麻雀虽小,五脏俱全,它包含了C++程序的两大部分,编译预处理命令和主函数,我们用它来介绍一下C++程序的基本结构。
上面程序的前两行,就是编译预处理命令。编译预处理,就是在程序运行前把它所需要的条件配备好,一个程序要运行,最重要的两个条件就是程序要用到的头文件和文件中的命名空间。头文件和命名空间里有造电脑时就有的标准函数、符号和对象,一般来说程序想要正常运行,就必须要用到这些,所以要先跟计算机说好,我要向你的头文件和命名空间里借用一下这些函数和符号了,才能在运行的时候用上。从上面的程序中看,我们想要的头文件就是<>里的 iostream ,因为要用到的东西包含在其中,所以前面有个 include ,而最开头的井号就没说啥意义了,只要记住要在开头写上就好了;第二行就是我们想要的命名空间了,这里暂时先不说命名空间和头文件的区别,只要我们先记住,要在头文件下的第二行写下这句“使用 命名空间 std”,前两个单词我们翻译出来了,最后那个是一个命名空间的名字,我们在C++程序中一般都要用到。最后还要记得在这行的尾巴上敲一个分号 ; ,表示我们向计算机借东西的这句话说完了,要知道,在C++语言里,分号就相当于句号,说完一句话,描述完一个问题,传达完一个指令后,在结尾都要敲个分号。
剩下的部分就是主函数了。C++程序里要有一个主函数,这个主函数里就是我们对问题的描述和对计算机下达的指令,上面程序中的主函数是 main(),在主函数前还有一个 int ,这表示函数的返回值是 int 类型的数据,这里的返回值就相当于这个函数的运算结果,这个结果可以被其他函数调用,而不一定直接作为输出结果,而且要注意的是,不一定每个程序都会用到返回值,在主函数前声明返回值的类型,只是一种习惯的格式。紧跟着函数头部的就是函数体了,函数体用花括号括起来,程序主要执行的就是花括号里的语句。这里要强调的是,一个程序里只能有一个主函数,这就有可能出现不够用的情况,所以可以在主函数之外,再敲一个或多个自定义函数,它们的结构和主函数差不多,只是函数名不同,可以用来补上主函数的缺漏,但是程序只能从主函数开始执行,也只能在主函数里结束,其他自定义函数一般是对从主函数里跳转出去的数据进行处理,最后还要把数据归还给主函数。
写好了程序,就可以将其输入到计算机里了,在计算机里,编译器会将这些代码编译成二进制数据,再和计算机的其他功能部分连接,最后就可以运行了,但是,要想全程正常运行并顺利结束,其中的任何一个步骤都不能出错,如果出错,就会回到写程序的编辑状态,让你查查看bug在哪里。
尾声
大一刚开学实在是事多繁忙,所以拖了将近三周才把这个系列的第一篇写完,也怪我没能做好时间管理,接下来要多挤点时间,把我学到的C++课本知识记录下来,点赞过十,就更下一期!