adinxu
by adinxu
~1 分钟 阅读用时

分类

标签

C/C++复习回忆整理_incomplete

时间过得真快啊,不知不觉都要工作三年了。工作时使用的是c语言,c++都忘得干干净净了。其实我是有点抗拒c++的,过于复杂的语言特性让人望而却步。。。目前除了c++,我还想学习的语言有:java,python,go,sql这几个。
java:工作机会多,好像是后端用的,可以面向对象
python:使用率居高不下,易用强大的各种库,感觉可以和别的语言配合,搞点事情
go:背靠亲爹google,新兴的宠儿
sql:学习下数据库
除了这几种外,可能我还会去了解一下rust
额,扯远了,看了看草稿箱里的十三篇开了个头的文章,这填坑不知道要填到啥时候去,vr真好玩。
其实关于c/c++复习整理,以及比较和c/c++异同的工作,我从之前就开始计划了,然而打开the c programming language,发现要看的东西还是不少的,然后就搁置了。
有一种说法叫make it down,get it down,get it better。先开始做比较重要。
先是c语言:
c语言中得内容有类型,变量,运算符,表达式,控制流,函数,指针等,其中除了char,int等,我把枚举,数组,结构体也归到类型里面去了。其实就和编程语言小记里面说的一样,由于要处理的东西是人类世界的,由此编程语言的各种要素也都是用机器模型体现的现实问题模型–基本所有编程语言都要涉及数据类型这个概念,抽象了二进制机器模型为问题模型。c语言的数据类型是需要提前声明的,c语言是静态的,弱类型的(这个存在争议),编译型语言。数据类型基本就是一块固定大小内存空间的,一组二进制编码的含义,以及其上支持的操作的集合。
至于变量,可以算作是数据类型的实例化,提到整数,他就是一个概念,而具体来说,就是1,2,3这些,变量是可变的量,其实上面那句关于数据类型的解释更适于用在变量身上,变量是实实在在在内存中占用空间的,而数据类型,只是一种概念而已。有可变的量,也有不可变的量,即常量,其实就是不能改变的值,或者不需要去改变的值。
运算符,其实是可以看做与数据类型关联的方法。我们在现实世界可以3除2,但一般不会两个汉字相除,每种数据类型有其方法。运算符的本质就是对实例对象进行作用。
表达式:变量和运算符组成构成表达式,每个表达式都有一个值。左值和右值是两个很奇怪的词汇,这里的左和右的参照物应该是等号。一个表达式中,左边的对象接受了右边的值,或是说将右边的值赋值给了左边的对象。既然是赋值,那就代表左边的值是一个拥有内存空间的对象,而右边不必,比如常数可以作为右边的对象。这两个对象可能就代表左值与右值,左值可以为右值,因为左值既有内存空间,又有值,而右值可能不能作为左值,比如常数,只有值,但没有内存空间的概念,你要是想给常数赋值肯定就错了。这里引用一下:

总结:能产生左值的表达式就4个:

.(访问结构成员)
->(访问结构体指针成员)
*(间接访问)
需要使用左值表达式的有:访问结构成员,自加自减, 取地址。

控制流,三种分类:顺序,分支,循环。一个表达式后面加上分号就成了一个语句。一条一条不包含分支和循环的语句,应该也算是顺序结构了。分支和循环则代表了选择和重复。
函数:函数是一种封装,是可以复用的部分的提取。
指针:c语言的精髓所在,是沟通上层与下层的桥梁,是抽象与具象的交界。c程序设计语言是这么描述指针的:

指针是一种保存变量地址的变量。

指针是一个抽象化的东西,而地址是具象化的,实实在在的代表了内存中得晶体管。指针全称应该叫指针变量,首先,他是一个变量,和char,short一样,他的内部能存储数据,而指针存储的数据是一个地址。
恩,我是按照c程序设计语言的目录来罗列的,此书的最后两章内容为:输入与输出、UNIX系统接口。应当是讲了一些标准库的东西以及在操作系统上的c语言编程。因为此处只涉及语言本身,所以不讨论相关内容。这里只是一个大概的梳理,实际还有很多内容未涉及,比如变量作用域,预处理,结构体自引用等。这里其实是为了看c++的时候不要搞混了,我总是有这个担心。。


下面开始c++:
到c++了,最近去面一个c++的岗位,总感觉面试官没问我太多的技术问题,很奇怪,虽然我提前说了我c++因为时间比较长,忘得差不多了,但是也只问了我一个关于c++的问题,也算老生常谈吧,问题是c和c++的区别有哪些。关于这个问题,我脑海里想到的第一件事情就是面向对象。c语言是过程式编程语言,他的语言特性在我看来就是去一步步,一条条的把一件事情说明白。以分析设计好的数据结构为骨,以各种数据为血液,以针对数据结构和数据的进行处理的操作为皮肉,构成一个完整的程序。而面向对象的编程方法,引入了一种新的名词叫做抽象,他是以这样的思想为支撑的:世间万事万物之间都有联系,他们是一个个分立的个体,同时又都拥有各种各样的关系。通过抽象,数据和操作之间不再是松散的两种东西,他们可以是属于一个对象。一个对象有其自己的数据,这是他的属性,比如人有自己的名字。一个对象也有自己的方法,这是对对象的数据的操作集合,比如每个人可以说出自己的名字。对象与对象之间有联系,比如小明是一个学生,他是一个人类,那么小明和人类之间简单来说就存在一个从属关系。小明是人类这个宽泛概念的实例化,是一个具体的人而不是虚拟的一个名词。小明属性之一是名字,方法之一是说出自己的名字。这里可以看到关于面向对象语言的一个神奇特性,继承。继承可以看做是一种重用,有人说我在c语言里也可以做到这点,但是c++有许多的语言特性来帮你更轻易的实现这一点。不仅仅是继承,面向对象语言的另外两个要素是封装与多态。封装把对象,数据,方法绑定到了一起,并可以加以区分,保护。比如小明,只有他爸妈和自己才能给自己改名字,别人不能说改就改了,而别人可以叫小明的名字。多态,可以类比生物多样性,他在继承父类属性方法时又获得了一种灵活性,东北虎,华南虎,非洲虎,他们都要进食,但他们的食谱和捕猎方法可能不尽相同,在对象特化为实例对象后,具体的细节也需要一一落实,多态的作用大概如此。
面向对象语言使得看待编程的方式发生了变化,这种关于对象关系的提取发挥了复用的威力,在GUI编程,各种各样的窗体,按钮,搜索栏等等都有了联系,相比于过程式编程语言,在GUI编程中面向对象的编程语言可能更具优势。
关于语言的细节,改天再写