- C语言与C++的主要区别
- 写程序的完整过程
C语言与C++的主要区别
C语言和C++的主要区别在于解决问题时的思维方式不同
-
C语言面向结构(过程)思维
结构即实现一个或多个功能的代码块,面向结构思维把一个大程序分成若干小结构,每个结构都完成一个或多个功能,所有结构合在一起就可以完成一个大的功能。
C语言相比C++的一些缺点:
(引入某C++视频中的例子,通过这些讲缺点的例子可以加深对面向过程和面向对象的含义的理解。)
(1) 程序的可维护性较差
结构化编程只是把大程序细化为若干个小结构,没有考虑数据安全性的问题。比如说数据还是属于整个程序的,这样就会导致某个地方对数据的修改,会对整个程序造成难以预料的影响。
举个例子:某个游戏将怪物的生命值设定为100,而这种怪物在戏中的数量为30个,由于生命值是属于整个程序的,而不是某个具体的怪物的,所以主角每砍怪物一下,30个怪物的生命值会下降10点,而主角杀死一个怪物以后30个怪物都会死亡。
(2)程序的可重用性较差
结构化编程没有将相关的数据和结构看作一个整体,所以无法利用已有的代码来创造新的代码。
举个例子:某游戏公司用结构化的方式创造了一个怪物,这个怪物是由若干个结构和若干个数据组成的,游戏公司希望在它的基础上再创造一个新的怪物,这个新的怪物只是比旧的怪物多了一个功能——跳跃,看上去要实现这个怪物很简单,但是由于结构化编程并没有将怪物看成是一个整体,所以他们需要重新编写这个怪物
C语言相比C++的优点 前面都是c语言相比C++的缺点(可能是因为例子的来源视频主讲C++),好奇去搜了相比之下C的优点,然后找到了运行速度上C的优势(只写一个但不是只有一个),排除写代码的人员水平因素外,一般情况用C语言写出来的代码是比C++写出来的代码运行得更快的(字符串连接实验,排序实验,标准流输实验这几个实验例外,这几个实验是C++比C更快)。不过,看了很多大神的说法,似乎用哪个语言更快,还要看编写程序的程序员的水平,以及解决不同的问题的时候哪个更适用。
-
C语言面向对象思维 (JAVA语言也是面向对象思维)
面向对象思维是将一个大的程序拆分为若干个对象,每个对象再封装部分数据和实现功能的方法。
一个对象想要访问另一个对象的数据,必须征得该对象的同意,而该对象中数据的改变也不会影响到其他对象,从而解决了数据的安全性问题;同时,面向对象允许将具有相同特征的对象划分为一类,而同一类的对象又可以继续向下派生,父生子,子生孙,代码不经修改即可重复利用,从而实现代码的重用。
拿游戏作比方游戏中30个怪物可以看作30个对象
,每个对象都拥有一个生命值,这样即使一个怪物的生命发生变化,也不会影响到其他的怪物。同时由于对象是一个整体,所以要创造一个新的怪物时,只需要在原来的怪物身上增加新的功能即可,而不用重写改代码。
总结:面向对象的C++使用起来比面向过程的C语言更加复杂(毕竟C++是在C语言基础上吸收大量编程思想发展来的,使用起来肯定更加复杂),但C++的有优点是面向对象的过程移植和复用的功能较强,即后期对程序的修改可能更为方便。
PS两者关系:C++是在C语言的基础上发展出来的,它在保留C语言原来优点的基础上吸收了面对对象的思想。C++语言包括了过程化语言部分(这部分和C语言差别不大)和类部分(C++特有),对C语言基本能实现完全兼容。
写程序的完整过程(从写出来——>有一个结果)
-
有集成开发环境时
1、开发工具(IDE):DevC++ Android Studio
2、创建项目,写代码
3、运行
4、结果
-
没有集成开发环境时
1、写代码-——文本编辑器(没有高亮,不能缩进等,容易出错)
- 文件扩展名为.c (这里把源文件记为test.c)
#include <stdio.h>
int main()
{
printf("hello world");
return 0
}
2、预编译或预处理——编译器(编译器指定编译的规则,每一个编译器都有自己的编译规则,比如GCC编译器中预编译指行指令为:gcc -E test.c -o test.i 这就是一条编译规则)(我们使用GCC 编译器)
预编译执行指令:gcc -E test.c -o test.i或gcc -E test.c
预编译
a.检查语法错误
b.展开(即把通过include定义的比如<studio.h> 当中的东西直接拿出来替换编写的代码中"#include <studio.h>"行)预处理后生成文件的扩展名为.i(记为test.i)
(PS介绍"展开")
1、将源文件中以"include"格式包含的文件复制到编译的源文件中
2、用实际值替换用"#define"定义的字符串
3、根据"#if"后面的条件决定需要编译的代码
3、编译——高级语言(即我们能看懂的语言如C语言)转化为汇编代码
- 编译指令:gcc -S test .i -o test.s
- 编译
a.检查语法错误
b.转化为汇编代码 - 编译后文件的扩展名为.s(记为test.s)
4、汇编——把汇编代码转化为二进制数据
- 汇编指令:gcc -c test.s -o test.o
- 汇编:将编译后的代码文件test.s转化为目标文件
- 汇编的目标文件,内容已变为由二进制数据表达
例如010001000011 - 汇编后文件扩展名为.o(记为test.o)
5、连接
- 连接指令:gcc test.o -o test
- 把所有的目标文件连接起来组成一个完整的可执行的程序(记为test)
以上过程简化为
1、编写源文件(test.c 高级语言)——>2、预编译(test.i 高级语言)——>3、编译(test.s 汇编语言)——4、汇编(test.o 二进制数据)——5、连接(test)
然后,这两个链接里面的内容很简洁明了,看不懂以上内容的时候可以康康这两个链接
https://wk.baidu.com/view/837b4b3c6294dd88d1d26b85?ivk_sa=1023194j
https://www.jianshu.com/p/d2a2de18e6d3
真的很好!!!
区别C++开发过程
编辑(.c或.cpp或.h)——预处理(在编译之前进行)——编译(生成扩展名为.obj的目标文件,该目标文件为源程序的目标代码,即机器语言指令)——链接(生成可执文件,扩展名为.exe)——运行与调试
问题区
- 展开中的#include、#define、#if都是宏展开吗(主要是#if)
- 预处理指令(即以#开头的行)与展开的关系是,展开是一种特殊的预处理指令,还是展开=预处理指令,还是别的
- 计算机能读懂二进制表达的指令,能读懂汇编语言表达的指令吗
- 汇编语言就是机器语言吗