C++ 和 Java 过程篇
2016-05-28 13:17
288 查看
作为一个菜鸟,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的东西来。
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的东西来。
相关文章推荐
- C++递归求斐波那契数列
- 关于C语言函数调用压栈和返回值问题的疑惑
- C++第6次作业
- C++实验6-项目4:字符删除
- 智能指针实现
- 微视图像(microview)gige相机开发手记(1)
- 关于#ifdef __cplusplus extern
- 用C++的 new 代替 C 的 malloc 进行内存分配
- 用C++的 new 代替 C 的 malloc 进行内存分配
- C语言中malloc函数返回值是否需要类型强制转换问题
- C语言中malloc函数返回值是否需要类型强制转换问题
- [leetcode] 【数组】73. Set Matrix Zeroes
- C++智能指针详解
- C语言 gets()和scanf()函数的区别
- 32位 64位系统中 各类型字节数
- 第8讲 字符常量的使用
- [leetcode] 【数组】 89. Gray Code
- 图片缩放与合并(C语言实现)
- C语言助记图
- C语言scanf函数详细解释