C和C++的区别详解
通过程序来介绍12345678//c program#includeiostreamusingnamespacestd;intmain(void){cout This is a c program. endl;return0;}1.iostream文件iostream中的io指的是输入进入程序的信息和输出从程序中发送出去的信息。并且c的输入、输出方案涉及iostream文件中的多个定义。比如用来输出信息的cout就在其中。2.头文件名的区别C语言C语言的传统是头文件使用扩展名 h将其作为一种通过名称标识文件类型的简单方式。例如 math.h支持一些数学函数。CC头文件没有扩展名。有些C头文件被转换成C头文件这些文件被重新命名去掉了扩展名h并在文件名称前面加上前缀c表示来自C语言3.名称空间namespace如果使用的是iostream,而不是iostream.h则应使用名称空间编译指令来使iostream中的定义对程序可用即1usingnamespacestd;有了这句using编译指令才能使用cout、cin等或者用第二种方式123usingstd::cout;usingstd::cin;usingstd::endl;名称空间是C的特性之一简单理解为可以将自己的产品封装起来。示例封装性示例首先定义一个头文件在里面写上我们自己编的东西123456#pragma oncenamespaceAA{typedefintINT;typenamecharCHAR;};然后在cpp文件中引入该头文件但我们却无法使用之前写好的东西。INT a会报错因为我们只引入了头文件没有使用里面的名称空间。正确做法123456789101112//c program#includeiostream#includeAA.husingnamespacestd;usingnamespaceAA;//using AA::INT;intmain(void){INTa 10;cout a endl;return0;}需要第六行的该名称空间才可以使用其中的产品。或者可以用第七行这种写法来确定自己只需要哪个产品。运行结果4.使用cout进行C的输出上面的程序有这条C语句1cout This is a C program. endl;符号表示该语句将把这个字符串发送给cout该符号指出了信息流动路径。 cout是一个预定义的对象。从概念上看输出是一个流即从程序流出的一系列字符。cout对象表示这种流其属性是在iostream文件中定义的。cout的对象属性包括一个插入运算符它可以将其右侧的信息插入到流中。图示指针和数组名的区别程序示例1234567891011#includeiostreamusingnamespacestd;intmain(void){inta 10;int* p a;intarr[] { 0,1,2,3,4 };cout p endl;cout arr endl;return0;}这里定义了一个指针p和一个数组arr。运行结果都是地址反汇编查看区别cout p endl;123456cout p endl;008F52AF mov esi,esp008F52B1 push offset std::endlchar,std::char_traitschar (08F103Ch)008F52B6 mov edi,esp008F52B8 mov eax,dword ptr [p]008F52BB push eaxcout arr endl;123456cout arr endl;008F52DE mov esi,esp008F52E0 push offset std::endlchar,std::char_traitschar (08F103Ch)008F52E5 mov edi,esp008F52E7 lea eax,[arr]008F52EA push eax区别在输出指针时需要先从p里面取出四字节再放到寄存器里push在输出arr时直接把arr放到寄存器里再push。结论指针是变量数组名是一个地址——常量。解引用在C语言中学到对指针解引用后得到的值就是它寸的地址对应的变量值。可以来探索原理程序示例123456789#includeiostreamusingnamespacestd;intmain(void){inta 10;int* p a;*p 20;return0;}反汇编代码12345678inta 10;000D18FF mov dword ptr [a],0Ahint* p a;000D1906 lea eax,[a]000D1909 mov dword ptr [p],eax*p 20;000D190C mov eax,dword ptr [p]000D190F mov dword ptr [eax],14h对于*p 20先从p的内存中取四个字节即变量a的地址放入寄存器再将20给到寄存器所存的的四字节中。完成对变量a的改变。所以解引用的意思就是从地址中把值取出来这里是去p的地址里取出所存的变量a的地址。程序示例2123456789#includeiostreamusingnamespacestd;intmain(void){inta 10, b 20;int* p a;b *p;return0;}反汇编代码12345678910inta 10, b 20;000818FF mov dword ptr [a],0Ah00081906 mov dword ptr [b],14hint* p a;0008190D lea eax,[a]00081910 mov dword ptr [p],eaxb *p;00081913 mov eax,dword ptr [p]00081916 mov ecx,dword ptr [eax]00081918 mov dword ptr [b],ecx对于 b *p;1.先去p里取出四字节放入寄存器2.再从寄存器eax取出四字节放入寄存器ecx再把ecx3.的内容放入到变量b的四字节中。也可以看出解引用这一步其实是去地址里取值的。这样也可以得出用一个变量赋值给另一个变量其实也是在解引用。示例123456789#includeiostreamusingnamespacestd;intmain(void){inta 10;intb;b a;return0;}反汇编123456inta 10;002D18F5 mov dword ptr [a],0Ahintb;b a;002D18FC mov eax,dword ptr [a]002D18FF mov dword ptr [b],eax对于 b a;也是从a地址里取出四字节放到寄存器再通过寄存器给入b。结论解引用到地址里去取值。const的区别C语言中为常变量示例123456789//const#includestdio.hintmain(void){constinta 10;intb 100;//常量赋值b a;//常变量赋值return0;}两次赋值的区别1234567const int a 10;00311825 mov dword ptr [a],0Ahint b 100;0031182C mov dword ptr [b],64hb a;00311833 mov eax,dword ptr [a]00311836 mov dword ptr [b],eax常量赋值时是直接把值给到b的四字节中用const修饰的a赋值时还是需要从a里取出四字节再赋给b。所以C语言中const修饰的变量叫做常变量——不能作为左值。甚至可以用指针改变它的值12345678910#includestdio.hintmain(void){constinta 10;intb 100;b a;int* p a;*p 20;return0;}a的变化const修饰的变量a居然能被改变C中的const在C中const修饰的变量就是常量和常量性质一样在编译期间直接将常量的值替换到常量的使用点。示例12345678intmain(void){constinta 10;intb, c;b 16;c a;return0;}反汇编代码1234567const int a 10;00B917F5 mov dword ptr [a],0Ahint b, c;b 16;00B917FC mov dword ptr [b],10hc a;00B91803 mov dword ptr [c],0Ah可以看出对b赋值常量是直接赋值对c赋值const修饰的变量a,同样是用常量赋值的。所以在C中 const修饰的变量和常量性质一样都是在编译期将常量值替换到常量的使用点。另外1.而且const修饰的变量必须初始化同样因为编译期间就会替换为常量不初始化后面也没有机会再对其赋值。2.如果用变量对const修饰的变量赋值则会使其退化成常变量。声明时const位置不同的区别示例const可在不同位置修饰变量12345678910111213intmain(void){inta 10;int* p1 a;constint* p2 a;intconst* p3 a;int*constp4 a;int* q1 a;constint* q2 a;intconst* q3 a;int*constq4 a;return0;}要注意的是const与离他最近的类型结合是该变量的类型除了最近的类型剩下的就是const修饰的内容。const修饰的内容是不可作为左值。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2555428.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!