您的位置:首页 > 编程语言 > C语言/C++

C++ 和 Java 过程篇

2016-05-28 13:17 267 查看
作为一个菜鸟,C++ 和 Java 都没有编过几行代码,然而,必须强行写点东西。

C++ 和 Java 真的很像了,从语法上来讲,两者越来越接近。大多数书都是从语法的角度来讲语言,哗啦啦的看完,被满满的细节束缚。今天突然想,是不是应该从实现的角度来看待呢?

作为一个语言,你想做什么呢?

先从面向过程的角度谈谈:

你怎么写,到最后都是0101的二进制,

所以从二进制回头看,你想知道这段二进制是干嘛的(CPU指令集),你想知道这段二进制代表人类能看懂的什么玩意(数据类型和编码方式),

反过来,作为一个语言,你希望有些数据类型,来表达自己想做什么,例如整型,浮点型,字符型等等,大多数高级语言都是强类型的,也就是认为你想表达啥,当你表达错了,例如字符串赋值给了整型,是不允许的。

而脚本语言大多都是弱类型的,你想表达啥,你就表达啥,表达错了,不好意思,自己的问题,你不写代码检查,没人帮你检查。

所以语言一开始讲的都是变量和基本类型

这样数据类型到底层的0101,我们知道了,这4个字节代表整型,那8个字节代表double。

貌似可以了,一切都很完美,现在我们想从0101到数据类型,咋办?

你定义一个变量时候,操作系统会在内存中分配一个位置,来存放变量的值。

学过汇编都知道,CPU读取内存中的数据要知道,内存地址,指针就是内存地址,汇编时候大多都是用把数据取出来放到寄存器中,读多少,就看寄存器多大。(呵呵哒,都是0101你不告诉人家啥时候停,人家读完首地址的一个字节后不就懵逼了?)指针的类型就是大小。

C/C++是有指针的概念,也就是理论上你可以操作内存的。Java觉得太危险,指针太头疼,一不小心搞坏了内存,破坏了数据,所以就去掉指针给Java攻城狮了。但指针的概念还是有必要了解的,Java对象可以看做封装了指针,我们间接的用了指针。

定义变量小case,这个变量到底有多大能耐,谁能用?

自然,每个变量都有作用域

作用域就是朋友圈。C++有个特殊的朋友圈,基于面向过程中的作用域,全局作用域中的变量或方法,只能定义一次,这也就多出来了static、extern、const的作用域。这就是为啥Java不需要有那么多概念的问题,一草一木都有对象,没有孤魂野鬼。

这个时候,回头想想,还少点啥?

一拍脑袋,好嘛,我们还没说变量呢,怎么就识别了变量,编译器咋认识的?

每个语言都有所谓的标识符,关键字。个人认为关键字就是编译器后头对应的一串代码,例如看到int,就知道他是想搞一个4个字节(大小依照操作系统而不同),好比汇编看到mov AX 1,就知道你是想给AX赋值为1。mov 和 AX就相当于关键字,对应CPU指令(作为菜鸟,并不知道高级语言底层的对应关系,也就想象着说着理解下)。

所以你不能把变量的名称跟关键字一样。每种语言都有一套所谓的标识符定义规则,基本上都差不多,例如C/C++是字母或下划线开头,Java中多了种$(一般生成的.class中,自己定义变量时用得少),苹果搞出来一种swift语言,甚至都可以汉字命名。不过自己定义时候大多数都是字母开头,框架类的使用_和$频繁些。

作为人类,你定义一堆变量有啥用?重点是干活,你要干啥?

我:运算

XX语言:我有算术运算符,逻辑运算符等等,保证满足你

我:额,那么多,我随便写一串,咋知道你怎么运算的?

XX语言:哥们,我是有运算符优先级的,有些就是小学生数学中的先后顺序,有些可能你不太知道,不过我给你一个表,你想咋弄,看着默算顺序,实在不行,你加括号,这样不干活提升优先级的东西。

我:这么好,挺好的,这样运算就能保证不出错了吧?

XX语言:实不相瞒,我只能知道运算符的优先级,却不知道计算的先后顺序,你是左边的先计算,还是后面的先计算,那我就不知道了,所以尽量别用会产生副作用(改变值)的表达式吧

C++语言:同上,另外,我还能运算符重载,不过暂且留到面向对象的时候再见面吧。

我:学汇编的时候我记得有loop,jmp这种跳转语句

XX语言:是的,我们也有,if for while switch,都有的

我:通篇写下来,太长了,不好看,你们有啥办法吗?

XX语言:定义成函数吧,少年,模块化,好维护

C++语言:关于函数我得多说两句,我有参数默认值,JAVA不行,另外我和JAVA都能重载函数,或者函数模板化

好了,条件和循环语句,表达式,运算符和函数,就不细致写了,C语言之后,这些东西基本也就没有变化了。

最后,你定义了个变量,不想随随便便修改,咋办?

赋值,没错,再定义一个变量,赋值不就行了?这样别人用新的变量随便改,自然旧变量还是原来的配方,还是原来的味道。所谓值传递就是这玩意。

常量,C++中const,Java中final。定义了就不能变了,由于C++中有指针和引用的概念,又多出来顶层const,底层const的东西来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: