网站建设智能小程序,盘锦门户网站制作,摄影网站建设公司,学ui设计难不难点击蓝字关注我们C语言和C到底是什么关系#xff1f;首先C和C语言本来就是两种不同的编程语言#xff0c;但C确实是对C语言的扩充和延伸#xff0c;并且对C语言提供后向兼容的能力。对于有些人说的C完全就包含了C语言的说法也并没有错。C一开始被本贾尼斯特劳斯特卢普#… 点击蓝字关注我们C语言和C到底是什么关系首先C和C语言本来就是两种不同的编程语言但C确实是对C语言的扩充和延伸并且对C语言提供后向兼容的能力。对于有些人说的C完全就包含了C语言的说法也并没有错。C一开始被本贾尼·斯特劳斯特卢普Bjarne Stroustrup发明时起初被称为“C with Classes”即「带类的C」。很明显它是在C语言的基础上扩充了类class等面向对象的特性和机制。但是后来经过一步步修订和很多次演变最终才形成了现如今这个支持一系列重大特性的庞大编程语言。1、C语言是面向过程语言而C是面向对象语言我们都知道C语言是面向过程语言而C是面向对象语言说C和C的区别也就是在比较面向过程和面向对象的区别。1面向过程和面向对象的区别面向过程面向过程编程就是分析出解决问题的步骤然后把这些步骤一步一步的实现使用的时候一个一个的依次调用就可以了。面向对象面向对象编程就是把问题分解成各个对象建立对象的目的不是为了完成一个步骤而是为了描述某个事物在整个解决问题的步骤中的行为。2面向过程和面向对象的优缺点面向过程语言优点性能比面向对象高因为类调用时需要实例化开销比较大比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发性能是最重要的因素。缺点没有面向对象易维护、易复用、易扩展面向对象语言优点易维护、易复用、易扩展由于面向对象有封装、继承、多态性的特性可以设计出低耦合的系统使系统更加灵活、更加易于维护缺点性能比面向过程低。二、具体语言上的区别1、关键字的不同C语言有32个关键字C有63个关键字2、后缀名不同C源文件后缀.cC源文件后缀.cpp在VS中如果在创建源文件时什么都不给默认是.cpp。3、返回值C语言中如果一个函数没有指定返回值类型默认返回int类型C中如果一个函数没有返回值则必须指定为void。4、参数列表在C语言中函数没有指定参数列表时默认可以接收任意多个参数但在C中因为严格的参数类型检测没有参数列表的函数默认为 void不接收任何参数。5、缺省参数缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时如果没有指定实参则采用该默认值否则使用指定的参。C语言不支持缺省参数· 半缺省参数· 全缺省参数注意· 在半缺省的情况下带缺省值的参数必须放在参数列表的最后面。· 缺省参数不能同时在函数的声明和函数定义中出现二者只能选其一。· 缺省值必须是常量或者全局变量。· 缺省参数必须通过值参或常参传递。6、函数重载函数重载函数重载是函数的一种特殊情况指在同一作用域中声明几个功能类似的同名函数这些同名函数的形参列表参数个数、类型、顺序必须不同返回值类型可以相同也可以不同常用来处理实现功能类似数据类型不同的问题。C语言没有函数重载C支持函数重载。C语言中产生函数符号的规则是根据名称产生这也就注定了c语言不存在函数重载的概念。而C生成函数符号则考虑了函数名、参数个数、参数类型。需要注意的是函数的返回值并不能作为函数重载的依据也就是说int sum和double sum这两个函数是不能构成重载的我们的函数重载也属于多态的一种这就是所谓的静多态。静多态函数重载函数模板动多态运行时的多态继承中的多态虚函数。使用重载的时候需要注意作用域问题请看如下代码。我在全局作用域定义了两个函数它们由于参数类型不同可以构成重载此时main函数中调用则可以正确的调用到各自的函数。但是请看main函数中被注释掉的一句代码。如果将它放出来则会提出警告将double类型转换成int类型可能会丢失数据。这就意味着我们编译器针对下面两句调用都调用了参数类型int的compare。由此可见编译器调用函数时优先在局部作用域搜索若搜索成功则全部按照该函数的标准调用。若未搜索到才在全局作用域进行搜索。总结C语言不存在函数重载C根据函数名参数个数参数类型判断重载属于静多态必须同一作用域下才叫重载。7、constC语言中被const修饰的变量不是常量叫做常变量或者只读变量这个常变量是无法当作数组下标的。然而在C中const修饰的变量可以当作数组下标使用成为了真正的常量这就是C对const的扩展。C语言中的const被修饰后不能做左值可以不初始化但是之后没有机会再初始化。不可以当数组的下标可以通过指针修改。简单来说它和普通变量的区别只是不能做左值而已其他地方都是一样的。C中的const真正的常量。定义的时候必须初始化可以用作数组的下标。const在C中的编译规则是替换和宏很像所以它被看作是真正的常量。也可以通过指针修改。需要注意的是C的指针有可能退化成C语言的指针。比如以下情况这时候的a就只是一个普通的C语言的const常变量了已经无法当数组的下标了。引用了一个编译阶段不确定的值const在生成符号时是local符号。即在本文件中才可见。如果非要在别的文件中使用它的话在文件头部声明externcosnt int data 10这样生成的符号就是global符号。总结C中的const叫只读变量只是无法做左值的变量C中的const是真正的常量但也有可能退化成c语言的常量默认生成local符号。8、引用说到引用我们第一反应就是想到了他的兄弟指针。引用从底层来说和指针就是同一个东西但是在编译器中它的特性和指针完全不同。首先定义一个变量a 10然后我们分别定义一个引用b以及一个指针p指向a。我们来转到反汇编看看底层的实现可以看到底层实现完全一致取a的地址放入eax寄存器再将eax中的值存入引用b/指针p的内存中。至此我们可以说在底层引用本质就是一个指针。了解了底层实现我们回到编译器。我们看到对a的值的修改指针p的做法是*p 20即进行解引用后替换值。再来看看引用修改我们看到修改a的值的方法也是一样的也是解引用。只是我们在调用的时候有所不同调用p时需要*p解引用b则直接使用就可以。由此我们 推断出引用在直接使用时是指针解引用。p直接使用则是它自己的地址。这样我们也了解了我们给引用开辟的这块内存是根本访问不到的。如果直接用就直接解引用了。即使打印b输出的也是a的地址。在此附上将指针转为引用的小技巧int *p a,我们将 引用符号移到左边 将 *替换即可int p a。接下来看看如何创建数组的引用intarray[10] {0}//定义一个数组我们知道array拿出来使用的话就是数组array的首元素地址。即是int *类型。那么array是什么意思呢int **类型用来指向array[0]地址的一个地址吗不要想当然了array是整个数组类型。那么要定义一个数组引用按照上面的小诀窍先来写写数组指针吧int(*q) [10] array;将右侧的对左边的*进行覆盖int(q)[10] array;测试sizeof(q) 10。我们成功创建了数组引用。经过上面的详解我们知道了引用其实就是取地址。那么我们都知道一个立即数是没有地址的即intb 10;代码是无法通过编译的。那如果你就是非要引用一个立即数其实也不是没有办法constint b 10即将这个立即数用const修饰一下就可以了。为什么呢这时因为被const修饰的都会产生一个临时量来保存这个数据自然就有地址可取了。9、malloc,free new,delete这个问题很有意思也是重点需要关注的问题。malloc()和free()是C语言中动态申请内存和释放内存的标准库中的函数。而new和delete是C运算符、关键字。new和delete底层其实还是调用了malloc和free。它们之间的区别有以下几个方面1、malloc和free是函数new和delete是运算符。2、malloc在分配内存前需要大小new不需要。例如int *p1 (int *)malloc(sizeof(int));
int *p2 new int; //int *p3 new int(10);malloc时需要指定大小还需要类型转换。new时不需要指定大小因为它可以从给出的类型判断并且还可以同时赋初始值。3、malloc不安全需要手动类型转换new不需要类型转换。4、free只释放空间delete先调用析构函数再释放空间如果需要。与第⑤条对应如果使用了复杂类型先析构再call operator delete回收内存。5、new是先调用构造函数再申请空间如果需要。与第④条对应我们在调用new的时候例如int *p2 new int;这句代码 底层代码的实现是首先push 4字节int类型的大小随后call operator new函数分配了内存。由于我们这句代码并未涉及到复杂类型如类类型所以也就没有构造函数的调用。如下是operator new的源代码也是new实现的重要函数我们可以看到首先malloc(size)申请参数字节大小的内存如果失败(malloc失败返回0)则进入判断如果_callnewh(size)也失败的话抛出bad_alloc异常。_callnewh()这个函数是在查看new handler是否可用如果可用会释放一部分内存再返回到malloc处继续申请如果new handler不可用就会抛出异常。6、内存不足开辟失败时处理方式不同。malloc失败返回0new失败抛出bad_alloc异常。7、new和malloc开辟内存的位置不同。malloc开辟在堆区new开辟在自由存储区域。8、new可以调用malloc(),但malloc不能调用new。new就是用malloc()实现的new是C独有malloc当然无法调用。10、作用域C语言中作用域只有两个局部全局。C中则是有局部作用域类作用域名字空间作用域三种。所谓名字空间就是namespace我们定义一个名字空间就是定义一个新作用域。访问时需要以如下方式访问以std为例std::cin123 std::endl;例如我们有一个名字空间叫Myname其中有一个变量叫做data。如果我们希望在其他地方使用data的话需要在文件头声明using Myname::data这样一来data就使用的是Myname中的值了。可是这样每个符号我们都得声明岂不是累死我们只要using namespace Myname就可以将其中所有符号导入了。这也就是我们经常看到的using namespace std;的意思啦。不学C语言能直接学C吗还是像前面所说C编程语言的第一大重要组成部分就是「面向过程编程」而这正是C语言老大哥的领域。即使没有学过C语言一上来就直接学习C的小伙伴应该也难逃『面向过程』这一部分的内容。从理论上来说学C前并不一定非得学C语言但是有C语言底子再去学C往往更具优势最起码「面向过程编程」这一部分内容能够轻车熟路。*声明本文于网络整理版权归原作者所有如来源信息有误或侵犯权益请联系我们删除或授权事宜。戳“阅读原文”我们一起进步