



版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C/C++语言全部关键字解释C语言32个关键字解释C语言的关键字共有32个,根据关键字的作用,可分其为数据类型关键字、控制语句关键字、存储类型关键字和其它关键字四类。!数据类型关键字(12个):char:声明字符型变量或函数double:声明双精度变量或函数enum:声明枚举类型float:声明浮点型变量或函数int:声明整型变量或函数long:声明长整型变量或函数short:声明短整型变量或函数signed:声明有符号类型变量或函数struct:声明结构体变量或函数union:声明联合数据类型unsigned:声明无符号类型变量或函数void:声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用)(2)控制语句关键字(12个):A循环语句for:ー种循环语句(可意会不可言传)do:循环语句的循环体while:循环语句的循环条件break:跳出当前循环continue:结束当前循环,开始下ー轮循环B条件语句(l)if:条件语句(2)else:条件语句否定分支(与if连用)goto:无条件跳转语句C开关语句switch:用于开关语句case:开关语句分支(3)default:开关语句中的“其他”分支Dreturn:子程序返回语句(可以带参数,也看不带参数)3存储类型关键字(4个)(Dauto:声明自动变量一般不使用(2)extern:声明变量是在其他文件正声明(也可以看做是引用变量)(3)register:声明积存器变量static:声明静态变量4其它关键字(4个):(1)const:声明只读变量(2)sizeof:计算数据类型长度(3)typedef:用以给数据类型取别名(当然还有其他作用(4)volatile:说明变量在程序执行中可被隐含地改变char8int16long32float32double64这是占的位数bit1Byte=8bit除以8就是字节数byteC语言32个关键字解释([color=Teal]C语言小知识:[/color])auto!声明自动变量一般不使用double:声明双精度变量或函数int:声明整型变量或函数struct:声明结构体变量或函数break:跳出当前循环else:条件语句否定分支(与if连用)long:声明长整型变量或函数switch:用于开关语句case:开关语句分支enum:声明枚举类型register:声明积存器变量typedef:用以给数据类型取别名(当然还有其他作用)char:声明字符型变量或函数extern:声明变量是在其他文件正声明(也可以看做是引用变量)return:子程序返回语句(可以带参数,也看不带参数)union:声明联合数据类型const:声明只读变量float:声明浮点型变量或函数short:声明短整型变量或函数unsigned:声明无符号类型变量或函数continue:结束当前循环,开始下ー轮循环for:ー种循环语句(可意会不可言传)signed:生命有符号类型变量或函数void:声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用)default:开关语句中的“其他”分支goto:无条件跳转语句sizeof:计算数据类型长度volatile:说明变量在程序执行中可被隐含地改变do:循环语句的循环体while:循环语句的循环条件static:声明静态变量if:条件语句C++全部关键字说明(l)auto这个这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto的。(2)register这个关键字命令编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提髙效率。(3)static常见的两种用途:1》统计函数被调用的次数;2>减少局部数组建立和赋值的开销.变量的建立和赋值是需要一定的处理器开销的,特别是数组等含有较多元素的存储类型。在ー些含有较多的变量并且被经常调用的函数中,可以将一些数组声明为static类型,以减少建立或者初始化这些变量的开销.详细说明:IX变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。2X变量用static告知编译器自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。3>当static用来修饰全局变量时,它就改变了全局变量的作用域,使其不能被别的程序extern,限制在了当前文件里,但是没有改变其存放位置,还是在全局静态储存区。使用注意:1>若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;2》若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;3>设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题(只要输入数据相同就应产生相同的输出)(4)const被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。它可以修饰函数的参数、返回值,甚至函数的定义体。作用:1》修饰输入参数a.对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用传递”,目的是提高效率。例如将voidFunc(Aa)改为voidFunc(constA&a)〇b.对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如voidFunc(intx)不应该改为voidFunc(constint&x)〇2>用const修饰函数的返回值a.如果给以“指针传递”方式的函数返回值加const修饰那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。如对于:constchar*GetString(void);如下语句将出现编译错误:char*str=GetStringO;//cannotconvertfromJconstchar*'to'char*';正确的用法是:constchar*str=GetStringO;b.如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。如不要把函数intGetlnt(void)写成constintGetlnt(void)〇3>const成员函数的声明中,const关键字只能放在函数声明的尾部,表示该类成员不修改对象.说明:consttypem;〃修饰m为不可改变示例:typedefchar*pStr;〃新的类型pStr;charstring[41="abc;constchar*pl=string;pl++;〃正确,上边修饰的是・pl,pl可变constpStrp2=string;p2++;〃错误,上边修饰的是p2,p2不可变,*p2可变同理,const修饰指针时用此原则判断就不会混淆了。constint*value:〃*value不可变,value"可变int*constvalue;〃value不可变,*value可变const(int*)value;//(int*)是ー种type,value不可变,*value可变〃逻辑上这样理解,编译不能通过,需要tydefint*NewType;constint*constvalue;〃*value,value都イ、可变(5)volatile表明某个变量的值可能在外部被改变,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值而不是使用保存在寄存器里的备份。它可以适用于基础类型如:int,char,long 也适用于C的结构和C++的类。当对结构或者类对象使用volatile修饰的时候,结构或者类的所有成员都会被视为volatile.该关键字在多线程环境下经常使用,因为在编写多线程的程序时,同ー个变量可能被多个线程修改,而程序通过该变量同步各个线程。简单示例:DWORD stdcallthreadFunc(LPVOIDsignal)int*intSignal=reinterpret_cast(signal);*intSignal=2;while(*intSignal!=1)sleep(1000);return0;)该线程启动时将intSignal置为2然后循环等待直到intSignal为1时退出。显然intSignal的值必须在外部被改变,否则该线程不会退出。但是实际运行的时候该线程却不会退出,即使在外部将它的值改为1,看一下对应的伪汇编代码就明白了:movax,signallabel:if(ax!=l)gotolabel对于C编译器来说,它并不知道这个值会被其他线程修改。自然就把它cache在寄存器里面。C编译器是没有线程概念的,这时候就需要用到volatile。volatile的本意是指:这个值可能会在当前线程外部被改变。也就是说,我们要在threadFunc中的intSignal前面加上volatile关键字,这时候编译器知道该变量的值会在外部改变,因此每次访问该变量时会重新读取,所作的循环变为如下面伪码所示:label:movax,signalif(ax!=l)gotolabel注意:ー个参数既可以是const同时是volatile,是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。(6)externextern意为"外来的”••,它的作用在于告诉编译器:有这个变量,它可能不存在当前的文件中,但它肯定要存在于エ程中的某ー个源文件中或者ー个D11的输出中。C++关键字(不同于c的关键字).C++包含的类型:booltruefalse.类型声明所用到的关键字classpublicprivateprotectedfriendmutableexplicitthis.虚拟与多态以及rttivirtualtypeidOstatic_cast<>()dynamic_cast<>()reinterpret_cast<>().泛型编程相关templateOtypename.全局函数和成员函数相关inline.堆管理newdelete.异常处理try{}catch(){}throw()[编辑本段]电脑语言用语关键字是用来标识文件中各个记录的特定数据项目的值。关键字是电脑语言里事先定义的,有特别意义的标识符,有时又叫保留字。系统定义了以下关键字:Const(常数)Dim(定义)As(为)Mod(取模)And(并且)Or(或者)Not(非)If(如果)Then(那么)Else(否则)Stop(停止)End(结束)Select(选择)Case(条件)Is(是)For(计数)To侄(J)Step(步长)Byref(传址)Byval(传值)Sub(子程序)Function(函数)Exit(退出)Do(做)Loop(循环)Until(除非)While(当)Wend(当结束)Let(让)Call(调用)Rem(注释)Integer(整数)Long(长整数)Single(单精度小数)Double(双精度,小数)Boolean(布尔)String(字符串,文字)Me(我)Private(私有)Public(公共)注意:vb里名称与关键字不区分字母的大小写;在c语言里,一切都是小写字母C,C++,java语言关键字调查统计:C,C++,JAVA共有的关键字 22个intcharfloatdoubleshortlongifelseswitchcasedefaultforwhiledovoidreturncontinuebreakconstgoto(JAVA中未用,但是保留字)volatilestaticC和C++共有的关键字(除三者共有)一一・10个unsignedsignedstructenumunionautoregisterexternsizeoftypedefC++和JAVA共有的关键字ーー11个(9个)classnewpublicprivateprotectedthistrythrowcatch(truefalse)C++#有的关键字(除JAVA和其共有的)ーー20个asmboolexplicitexportfriendinlinemutableoperatortemplatetypeidvirtualwarch_tdeletenamespacetypenameusingconst_castdynamic_castreinterpret_caststatic_castJAVA特有的关键字(除C++和其共有的)———17个abstractbooleanbyteextendsfinalfinallyimplementsimportinstanceofinterfacenativepackagesupersynchronizedthrowstransientstrictfpnull(仅在java用,类似true和false不是关键字)所以说:C有22+10=32个关键字C++有22+10+11+20=63个关键字JAVA有22+9+17=48个关键字C++关键字详细解释autobreakcasechatclassconstcontinuedefaultdeletedodoubleelsegotoifinlineintlongmutablenewoperatorprivateprotectedpublicregisterreturnshortsignedsizeofstaticstatic_castgotoifinlineintlongmutablenewoperatorprivateprotectedpublicregisterreturnshortsignedsizeofstaticstatic_caststructswitchthistypedefunionunsignedvirtualviodwhileC++语言关键字asmdoifreturntryautodoubleinlineshorttypedefbooldynamic_castintsignedtypeidbreakelselongsizeoftypenamecaseenummutablestaticunioncatchexplicitnamespacestatic_castunsignedcharexportnewstructusingclassexternoperatorswitchvirtualconstfalseprivatetemplatevoidconst_castfloatprotectedthisvolatilecontinueforpublicthrowwchar_tdefaultfriendregistertruewhiledeletegotoreinterpret.cast关键字是预先保留的标识符,每个关键字都有特殊的含义。我们不能在程序中使用与关键字同名的标识符。以下是C++所保留的关键字全集。(l)asmasm已经被ーasm替代了,用于汇编语言嵌入在C/C++程序里编程,从而在某些方面优化代码.虽然用asm关键字编译时编译器不会报错,但是asm模块的代码是没有意义的.(2)auto这个这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto的。(3)bad_cast,const_cast,dynamic_cast,reinterpret_cast,static_cast(4)bad_typeid也是用于异常处理的,当typeid操作符的操作数typeid为Null指针时抛出。(5)bool不用多说了吧,声明布尔类型的变量或函数.(6)break跳出当前循环.(7)caseswitch语句分支.(8)catch,throw,try都是异常处理的语句。(9)char声明字符型变量或函数.(10)class声明或定义类或者类的对象.(11)const被const修饰的东西都受到强制保护,可以预防意外的变动,能提髙程序的健壮性它可以修饰函数的参数返回值甚至函数的定义依作用:.修饰输入参数a.对于非内部数据类型的输入参数应该将“值传递”的方式改为“const引用传递”,目的是提髙效率。例如将voidFunc(Aa)改为voidFunc(constA&a)。b.对于内部数据类型的输入参数不要将“值传递”的方式改为“const引用传递”。否则既达不到提髙效率的目的,又降低了函数的可理解性。例如voidFunc(intx)不应该改为voidFunc(constint&x)〇.用const修饰函数的返回值a.如果给以“指针传递”方式的函数返回值加const修饰那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。如对于:constchar*GetString(void);如下语句将出现编译错误:char*str=GetStringO;//cannotconvertfromJconstchar*'to'charギ;正确的用法是:constchar*str=GetStringO;b.如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。如不要把函数intGetlnt(void)写成constintGetlnt(void)〇.const成员函数的声明中,const关键字只能放在函数声明的尾部,表示该类成员不修改对象.说明:consttypem;〃修饰m为不可改变示例:typedefchar*pStr;〃新的类型pStr;charstring[4]="abc";constchar*pl=string;pl++;〃正确,上边修饰的是・pl,pl可变constpStrp2=string;p2++;〃错误,上边修饰的是p2,p2不可变,*p2可变同理,const修饰指针时用此原则判断就不会混淆了。constint*value;〃・value不可变,value可变int*constvalue;〃value不可变,*value可变const(int*)value;//(int*)是ー种type,value不可变,*value可变〃逻辑上这样理解,编译不能通过,需要tydefint*NewType;constint*constvalue;〃・value,value都イ、可变(12)continue结束当前循环,开始下ー轮循环.(13)defaultswitch语句中的默认分支.(14)delete经常用于动态内存分配的语句。(15)do在do-while循环结构中开始循环体。(16)double声明双精度变量或函数.(17)else条件语句否定分支(与if连用).(18)enum声明枚举类型.(19)explicit这个关键字声明说明符,可以只适用于同类构造函数声明。显式构造函数不能在隐式转换的一部分。它只能用于显式构造ー个对象。(20)exportMSDN只说Theexportkeywordisnotsupportedontemplates.ー种导出语句吧..(21)externfalse,truebool类型的两个枚举值.(23)float声明浮点型变量或函数.forー种循环语句。(25)friend声明友元函数或者类。(26)goto无条件跳转语句。if条件语句。常与else一起用。(28)inline声明定义内联函数,编译时将所调用的代码嵌入到主函数中。(29)int声明整型变量或函数.long声明长整型变量或函数.mutable这个关键字只适用于非静态和非const数据类成员。如果ー个声明数据成员是可变的,那么它在const成员函数的赋值是合法。(32)namespace动态导入到文档中的元素行为c++中usingnamespacestd(33)new动态内存分配。返回一个适当类型、非零对象的指针(34)operator(35-37)private,protected,public类私有/保护/公有函数和数据成员的标示.(38)register声明寄存器变量.(39)return子程序返回语句(可以带参数,也看不带参数),返回函数调用点。(40)short声明短整型变量或函数.(41)signed,unsigned声明有符号类型变量或函数;声明无符号类型变量或函数.(42)static声明静态变量.(43)struct声明结构体变量或函数.(44)switch条件选择(45)template模板.(46)this访问类,结构或者联合的非静态成员函数。(47)typedef用以给数据类型取别名.(48)typeid用于获取ー个在编译时类型的类型(49)typename仅在模板中使用,告诉编译器是ー个未知的type。(50)union声明联合数据类型.using(52)virtual声明虚基类或虚函数。(53)void声明函数无返回值或无参数,声明无类型指针.(54)volatile(55)wchar_t宽字.(56)while循环语句的循环条件(57)class类C++语言中const关键字的详细使用解释生中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助。Const是空中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。一>Const作用如下表所示:No.作用说明参考代码1可以定义const常量constintMax=100;2便于进行类型检查const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检査,而对后者只进行字符替换,没有类型安全检査,并且在字符替换时可能会产生意料不到的错误voidf(constinti){ }〃对传入的参数进行类型检查,不匹配进行提示3可以保护被修饰的东西防止意外的修改,增强程序的健壮性。voidf(constinti){i=10;//error!}〃如果在函数体内修改了i,编译器就会报错4可以很方便地进行参数的调整和修改同宏定义ー样,可以做到不变则已,ー变都变5为函数重载提供了一个参考classAvoidf(inti){ }〃ー个函数voidf(inti)const{ }〃上一个函数的重载・・・・・・};6可以节省空间,避免不必要的内存分配const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#defineー样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝ttdefinePI3.14159 〃常量宏constdoulbePi=3.14159;〃此时并未将Pi放入ROM中doublei=Pi;〃此时为Pi分配内存,以后不再分配!doubleI=PI;〃编译期间进行宏替换,分配内存doublej=Pi;〃没有内存分配double尸PI;〃再进行宏替换,又一次分配内存!7提高了效率编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为ー个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高二、Const的使用1、定义常量(l)const修饰变量,以下两种定义形式在本质上是ー样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。TYPEconstValueName=value;constTYPEValueName=value;(2)将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初始化,仅仅作为声明,编译器认为在程序其他地方进行了定义.extendconstintValueName=value;2、指针使用CONST(1)指针本身是常量不可变(char*)constpContent;const(char*)pContent;(2)指针所指向的内容是常量不可变const(char)*pContent;(char)const*pContent;(3)两者都不可变constchar*constpContent;(4)还有其中区别方法,沿着・号划一条线:如果const位于・的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于・的右侧,const就是修饰指针本身,即指针本身是常量。3、函数中使用CONSTconst修饰函数参数a.传递过来的参数在函数内不可以改变(无意义,因为Var本身就是形参)voidfunction(constintVar);b.参数指针所指内容为常量不可变voidfunction(constchar*Var);c.参数指针本身为常量不可变(也无意义,因为char*Var也是形参)voidfunction(char*constVar);d.参数为引用,为了增加效率同时防止修改。修饰引用参数时:voidfunction(constClass&Var);〃引用参数在函数内不可以改变voidfunction(constTYPE&Var);〃引用参数在函数内为常量不可变这样的ー个const引用传递和最普通的函数按值传递的效果是ー模ー样的,他禁止对引用的对象的一切修改,唯一不同的是按值传递会先建立一个类对象的副本,然后传递过去,而它直接传递地址,所以这种传递比按值传递更有效.另外只有引用的const传递可以传递ー个临时对象,因为临时对象都是const属性,且是不可见的,他短时间存在ー个局部域中,所以不能使用指针,只有引用的const传递能够捕捉到这个家伙.const修饰函数返回值const修饰函数返回值其实用的并不是很多,它的含义和const修饰普通变量以及指针的含义基本相同。constintfunl()〃这个其实无意义,因为参数返回本身就是赋值。constint*fun2()〃调用时constint*pValue=fun2();
〃我们可以把fun2()看作成一个变量,即指针内容不可变。int*constfun3() 〃调用时int*constpValue=fun2();〃我们可以把fun2()看作成一个变量,即指针本身不可变。一般情况下,函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载。通常,不建议用const修饰函数的返回值类型为某个对象或对某个对象引用的情况。原因如下:如果返回值为某个对象为const(constAtest=A实例)或某个对象的引用为const(constA&test=A实例),则返回值具有const属性,则返回实例只能访问类A中的公有(保护)数据成员和const成员函数并且不允许对其进行赋值操作这在一般情况下很少用到4、类相关CONST(1)const修饰成员变量const修饰类的成员函数,表示成员常量,不能被修改,同时它只能在初始化列表中赋值。classAconstintnValue;〃成员常量不能被修改constintnValue;〃成员常量不能被修改A(intx):nValue(x){};〃只能在初始化列表中赋值}(2)const修饰成员函数const修饰类的成员函数,则该成员函数不能修改类中任何非const成员函数。一般写在函数的最后来修饰。classA(•••voidfunction。const;〃常成员函数,它不改变对象的成员变量.〃也不能调用类中任何非const成员函数。}对于const类对象/指针/引用,只能调用类的const成员函数,因此,const修饰成员函数的最重要作用就是限制对于const对象的使用。const成员函数不被允许修改它所在对象的任何ー个数据成员。const成员函数能够访问对象的const成员,而其他成员函数不可以。(3)const修饰类对象/对象指针/对象引用• const修饰类对象表示该对象为常量对象,其中的任何成员都不能被修改。对于对象指针和对象引用也是ー样。, const修饰的对象,该对象的任何非const成员函数都不能被调用因为任何非const成员函数会有修改成员变量的企图。例如:classAAA(voidfund();voidfunc2()const;}constAAAaObj;aObj.fund();XaObj.func2();正确constAAA*aObj=newAAA();aObj->fund();XaObj->func2():正确三、将Const类型转化为非Const类型的方法采用const_cast进行转换。用法:const_cast<type_id>(expression)该运算符用来修改类型的const或volatile属性。除了const或volatile修饰之外,type_id和expression的类型是ー样的。常量指针被转化成非常量指针,并且仍然指向原来的对象;常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。C++经典语句(一)2求两个数的和程序如下:#includeくiostream.h>voidmain()inta,b,sum;//定义了三个整型变量a=43;//把整数常量赋给变量ab=37;sum=a+b;//a与b相加的和赋给变量sumcoutくくThesumis'くくsum;cout«endl;//endl是回车换行的作用}程序运行结果如下:Thissumis801.1.3计算圆面积#include<iostream.h>voidmain(){constfloatpai=3.14;//用const说明了一个float型常量pai,m由于pai是常量,所以在//程序中这个值不会被改变floatradius;/Z说明了一个float型变量radius,用于存放半径值coutくくEnterradius:*;cin»radius;//cin为iosream.h中说明的文件,作用为接收键盘输入。如此/Z时从键盘输入ー个数2.5j就把输入的这个值送入变量radius,floatarea=pai*radius*radius;/Z说明了一个float型常量area,用于存放计算后的面积coutくくXnTheareaofcircleis:*;cout«area«endl;/Z输出面积}程序运行结果如下:Enterradius:2.5Theareaofcircleis19.625说明:这个程序相对于progam1_2有一个明显的优点,就是它的输入数据不必在编程时确定而是在运行时由操作者直接从键盘输入。上面的程序称为简单程序。直观上看,它们都很短,进ー步分析发现它们有两个特点:1)程序要做的事情是由程序员在编程时就安排好了的是固定不变的。2)程序要做几个动作也是由程序员在编程时安排好的程序实际上是ー个简单的命令序列。下面的程序有了“判断”的能力。此程序用于温度值(攝氏与华氏温度)的换算,输入温度值并指出该值是攝氏(C)还是华氏(F)温度,然后程序根据不同的输入(攝氏或华氏)进行不同的换算。2.1按条件进行判断#include<iostream.h>voidmain(){floatt,tc,tf;charcorf;constfloatfac=l.8,inc=32;coutくく“Entertemperature:cin»t;/7输入温度值cin»corf;/Z指出是攝氏(C)或华氏(F)if(corf=,c'corf='C'){tc=t;tf=t*fac+inc;)elseif(corf=,F'corf='f'){tf=t;tc=(t-inc)/fac;)elsetc=tf=0.0;cout«endl«*Thetemperatureis:coutくくtcくく"C="くくtfくく"F\n";}程序运行结果如下:Entertemperature:40.2CThetemperatureis40.2C=104.36F下面是使用switch(开关)语句的程序。switch提供了多分支选择的方法。5.2简单的计算器程序这个程序完成的功能是:输入两个数,然后输入运算符,在屏幕上显示运算结果。程序运行结果如下:#includeくiostream.h>voidmain(){intx,y;charop;coutくくfirstinteger:";cin»x;cout«endl«ASecondinteger:*;cin»y;coutくくendlくく“operator(+,-,*,/,%):cin»op;switch(op)//switch开关分支语句从这里开始,根据表达式的值分支{case'://如果op=='+'coutくくendlくくxくく"+"くくyくく"="くくx+y;break;/Z执行完毕,退出switch分支。下面的break语句的作用相同case'//如果op=='-'coutくくendlくくxくく"-"くくyくく"="くくx-y;break;case'*'://如果op=='*'coutくくendlくくxくく"*"くくyくく"="くくx*y;break;case'/':〃如果op=='/'coutくくendlくくxくく"/"くくyくく"="くくx/y;break;case'%'://如果op=='%'coutくくendlくくxくく"%"くくyくく"="くくx%y;break;default:cout«endl«*Wrong!”;}}程序运行结果如下:firstinteger:12secondinteger:7operator(+,*,/,%):*12*7=84上面的这个程序可以由用户任意输入两个整数及运算符,完成指定的运算,但是它的不便之处是当有多次运算要进行时,每算完一次必须重新启动程序。下面的程序使用循环控制语句,使得程序可以进行多次运算。〃program2_5.cpp#include<iostream.h>voidmain(){intx,y,quit=l;charop,cont;while(quit)//whiel循环语句,括号里面是ー个表达式,称为控制表达式。当这个表{/Z达式的值为1时继续循环体内的代码。从这个大括号开始,进入循环体。cin»x;cin»y;cin»op;switch(op){case'+':coutくくendlくくxくく"+"くくyくく"="くくx+y;break;case'-':coutくくendlくくxくく"-"くくyくく"="くくx-y;break;case'*':coutくくendlくくxくく"*"くくyくく"="くくx*y;break;case'/':if(y==0)cout«endl«"Overflow!";//判断y是否为〇,避免除〇错误。elsecoutくくendlくくxくく"/"くくyくく"="くくx/y;break;case'%':if(y==0)cout«endl«*Overflow!*;/Z判断y是否为〇,避免除〇错误。elsecoutくくendlくくxくく"%”くくyくく"="くくx%y;break;default:cout«endl«"Wrong!";break;}cout«endl«"Doyouwanttocontinue?(yorn)cin»cont;if(cont='n')quit=0;//当操作者输入字符‘n'时,由于quit被赋值〇。/Z当再次检测while表达式时,由于quit为〇,所以退出while循环。)}这个程序所做出的改进是很明显的,只要在每次完成一次计算后,用户回答是否继续时按下‘y‘键(或除‘n’之外的任何字符),就可以连续运行,完成用户指定的四则运算,直到接收到字母'n'为止。在循环体内必须有改变while表达式值的语句否则一旦进入死循环就无法跳出,这种情形称为“死循环”,编程中应注意避免。3计算e的值和求素数e是自然对数的底,它和nー样是数学中最常用的无理数常量。其近似值的计算公式为:e=l+l/l!+1/2!+1/3!+...+l/(n-l)!+r当n充分大时,这个公式可以计算任意精度e的近似值。为了保证误差r<e,只需l/(n-l)!(>r)<e程序代码如下:#include<iostream.h>voidmain(){constdoubleeps=0.Ie-10;intn=l;floate=l.0,r=l.0;do//开始do循环。循环条件由后面的while中的表达式值确定。{e+=r;n++;r/=n;)while(r>eps);coutくくTheapproximateValueofnaturallogarithmbaseis:cout«e«endl;}程序运行结果如下:TheapproximateValueofnaturallogarithmbaseis:2.71828说明:上面这个程序中使用了do循环,它是循环控制中的ー种。循环控制条件放在后面的while表达式中。下面的程序用来求出1000以内的全部素数。#includeくiostream.h>voidmain(){constintm=1000;inti,j,isprime;for(i=2;i<=m;i++)/Z这里用到了for循环控制语句。for循环语句有三个表达式{/Z第一个表达式赋给变量初值,第二个表达式为循环控制条件,//第三个表达式为循环变量改变其值isprime=l;for(j=i-l;j>l;j-)if(i%j==0)isprime=0;if(isprime)cout«i«,,,;if(i%30==0)cout«endl;})说明:D当m值比较大时,这个程序计算量是比较大的,事实上这是用来求出小于m的所有素数的最简单也是最笨的算法。ー种办法是作下面的改进:把for(j=i-l;j>l;j—)改为:intil=int(sqrt(i));for(j=il;j>l;j~)为了确定整数i是不是素数,不需要用2,3,。。。,i-l来除它,只需用2,3,。。。,sqrt(i)试除就可以了。这里sqrt(i)是标准函数,功能是计算平方根,而int()则是把浮点值围化为整型值。另ー种算法是埃拉脱散(Eratosthenes)筛法,将在以后介绍。统计学生成绩已知n个学生的注册号和成绩,计算他们的平均成绩,并列出成绩最好的前t名学生的注册号和分数。程序代码如下:#include<iostream.h>constintn=3;constintt=n;intindex[n];/Z存放注册号floatscore[n];//存放成绩for(inti=0;i<n;i++)cin»index[i]»score[i];/Z从键盘输入数据floatsum=0;for(i=0;i<n;i++)sum+=score[ih/Z计算分数总和cout.precision(2);/Z设置输出精度cout«endl«*Averagescore:*«sum/n;cout.width(28);/Z输出精度cout«endl«*registernumberscore*;for(i=0;iくt;i++)〃选取前t名分数最高的学生,输出其注册号和成绩(floats=score[i];intjl=i;for(intj=i+l;j<n;j++)if(sくscore[j])s=scorejl=j;)if(jl>i){score[jl]=score[i];score[i]=s;j=index[jl];index[jl]=index[i];index[i]=j;)cout.width(4);/Z输出序号,注册号和分数cout«endl«i+l;cout.width(11);/Z设置宽度cout«index[i];cout.width(16);cout.precision(2);/Z设置输出精度cout«score[i];)cout«endl;)程序运行结果如下:142701568915867Dueragescore:75registernumberscoreTOC\o"1-5"\h\z1 156 892 142 703 158 67cout.precision⑵是ー个函数调用语句,函数名是precisionocout说明此函数是ー个标准类的ー个标准对象cout的函数。所“标准”,即它们所涉及的流(stream)类和对象cout都是由系统已经义好了的。其说明可以在头文件iostream,h中找到。函数precision要求一个int型参数该参数指出在后面输出的浮点数的精度取到小数点后的多少位。cout.width。是另ー个函数的用法。width决定了其后数据输出的宽度。输出三角函数表输出人。〜90度之间每隔15度的正弦、余弦、正切函数值。程序代码如下://program3_2.cpp#include<iostream.h>#include<math.h>constfloatpai=3.1416f;constintinterval=15;cout.width(10);cout«z,Anglex”;cout.width(10);coutくく“sin(x)";cout.width(10);cout«"cos(x)";cout.width(10);cout«"tan(x)";floatarc;cout.precision(4);for(intdoa=0;doa<=90;doa+=interval){arc=pai*doa/180;cout«endl;cout.width(10);cout«doa;cout.width(10);cout«sin(arc);cout.width(10);cout«cos(arc);cout.width(10);if(doa==90)coutくく"-";elsecout«tan(arc);)cout«endl;} 程序运行结果如下:Anglexsin<x>cos<x>tan<x>0010150.25880.96590.2679300.50.8660.5774450.70710.70711600.8660.51.732750.96590.25883.732901-3.62e—006—说明:1)本程序中使用了系统提供的标准库函数sin(),cos(),tan()»它们都在头文件math.h中说明。因此在3行包含了此文件。2)由于当doa=90时,其正切函数趋于无穷大,故对它有特殊的处理,否则如按正弦、余弦ー样输出,当doa变到90时,运行将可能溢出或打印一个超界的大数。3Eratosthenes筛法求素数在2_3节给出了一个求在ー个范围内的全部素数的程序.下面给出的程序其算法比原来的好。program3_5是对2〜1000的所有素数进行检测,用小于该数的数试验,如果都不能除尽,就找到了一个素数。本节的程序也是用来求1000以内的所有素数,但其思想简单而巧妙。它是把2〜1000所有的整数放到ー起首先把2保留,把2的所有素数从中去掉,再保留3,同时删去所有3的倍数,下ー个数是5,7..,〇好象是一把筛子,把不需要的数逐步筛去,留下的正是所求的数。程序代码如下:#include<iostream.h>#include<iomanip.h>voidmain(){constintn=1000;inti=l,j,count=0,sieve[n+1];for(j=l;j<n;j++)sieve[j]=j;//把1〜n存入sieve[n]while(i<n+l)/Z从while循环开始完成全部素数的产生和输出。{while(sieve[i]=l)i++;/Z跳过值为1的分量,表示下ー个分量必为一素数cout«setw(4)«sieve[i];//setw(4)设置以宽度为4的格式输出数据。setw(4)
/Z等价于cout.width(4)count++;if(count%15=0)cout«endl;for(j=i;j<n+l;j+=i)sieve[j]=l;))程序运行结果如下:2353591271311992112832933833894674795775876616737697738778815 761671371392353591271311992112832933833894674795775876616737697738778815 76167137139223227307311397401487491593599677683787797883887111371731491512292333133174094194995036016076917018098119079111719232931798389971011571631671731792392412512572633313373473493534214314334394435095215235415476136176196316417097197277337398218238278298399199299379419473?414347103107109113181191193197269271277281359367373379449457461463557563569571643647653659743751757761853857859863953967971977以前给出的程序都是由一个函数组成的,实际上,ー个真正的C++程序几乎都包含若干个由用户自定义的函数。在下面的几个程序实例中,都调用了由用户定义的函数。三次方程求根按照Cardan公式,计算三次方程x3+px+q=0的ー个实根的公式为:xr"J-2+7(2),+(i),+7-l-7<2,,+(f)*在计算实根xr的程序中,把计算ー个浮点数的立方根的程序作为ー个用户定义的函数,而在主程序中两次调用这个函数。在计算,す过程中,使用迭代公式1r・,尸マ,+ホ程序代码如下:#include<iostream.h>#include<math.h>floatcuberoot(float);/Z自定义函数的原型voidmain(){floatp,q,xr;coutくくInputparamertersp,q:;cin»p»q;floata=sqrt(q/2*q/2+p/3*p/3*p/3);xr=cuberoot(-q/2+a)+cuberoot(-q/2-a);/Z调用cuberoot函数cout«endl«*Therealrootoftheequationis”くくxr;)floatcuberoot(floatx)/Z自定义函数代码从这里开始floatroot,croot;constfloateps=le-6;croot=x;do{root=croot;croot=(2*root+x/(root*root))/3;)while(abs(croot-root)>eps);returncroot;)四元排序程序对于任意的四个整数经过处理令其按从大到小的顺序排序,#include<iostream.h>voidswap(int&,int&);/Z自定义函数原型voidmain(){inta,b,c,d;cout«*Input4integers:cin»a»b»c»d;if(a<b)swap(a,b);/Z调用自定义函数swap()if(b<c)swap(b,c);if(c<d)swap(c,d);if(a<b)swap(a,b);if(b<c)swap(b,c);if(a<b)swap(a,b);cout«endK<a«*"くくbくく""«c«""«d;)voidswap(int&x,int&y)/Z自定义函数代码从这里开始{inttemp;temp=x;x=y;y=temp;)程序运行结果如下:Input4integers:17258414125178说明:这是ー个简单的程序。函数swap。是void类型,这表明它没有返回值,所有用户定义函数都必须指明返回类型,无返回值的函数必须说明为void类型。函数swpa()有两个整型参数,在参数表中的符号‘&'表明参数x和y是“引用参数”。这与上节中的floatx不同,后者称为赋值参数。引用参数和赋值参数在使用中主要有下面几点区别:1)在形参表中增加符号'&'2)在调用该函数时,引用参数对应的实参必须是指定类型的变量。如调用swap(a,b)中的实参a,b都是整型变量。而在上节中的赋值参数却是ー个表达式,表达式的念是包含了常量、变量和一般的表达式。比如在本例中,写成swap(a+b,a-c)或swap(41,a*a+d*d)等都是错误的。引用参数和引用调用是C++语言的ー种重要功能,如果swap()的两个参数说明为赋值形参,会出现什么情况?本例中的排序并不是ー个好的方法,实际上,关于排序有很多好的算法可用。注意:在编程中函数的作用是太重要了,不过函数有利于编程、用利于程序结构,却不能提高程序的效率。相反,在函数调用时由于要保留“现场”以备在函数计算完成返回时继续运行原来的程序。因此,函数的每次调用,系统都要额外在时间和空间上付出ー些代价。为了解决这个问题,C++语言设置了内联函数“inline",其具体规定是:1)在函数定义和说明之前增加关键字inline:inlinevoidswap(int&x,int&y){ }2)调用内联函数与调用非内联函数的调用效果完全相同不同的是在对源程序进行编译时,对于非内联函数»其程序代码只有一份,在每个调用语句处,通过转移控制语句来运行,然后返回。对于内联函数处理则不同它是把函数体的程序代码放到每个调用该函数的语句处。例如可以把swap。函数说明为内联的:inlinevoidswap(int&x,int&y){inttemp;temp=x;x=y;y=temp;)经过这ー改动,主函数仍不变,通过编译生成的目标程序将使swap()的函数体程序代码在其中出现6次。由此,我们可以看出,采用内联函数一方面在源程序的编写中仍可因使用函数而使程序简短清晰,另一方面在执行中又不必付出调用过程的时间和空间代价,唯一的代价是目标程序加长了。一般说,调用次数不多的函数或函数体规模较大的函数,其调用代价相对可以忽略,不宜采内联函数。而函数体积短小且又频繁被调用的函数可以说明为内联函数。例如对于更多个整数的排序算法,如果需要调用swap。的话,那么swap。函数应该说明为内联的。”三色冰激淋"程序这是ー个由冰激淋商提出来的问题,有28种颜色的原料,可以组合成多少种三色冰激淋。ー种答案是有19656=28*27*26种,称为(28,3)的排列数A328,它是把同样三种颜色的不同排列数也计算进来了,另一答案是3276=19656/3!种,称为(28,4)的组合数。其中28为元素数,3为选择数。下面的程序对输入的元素数和选择数计算相对应的排列数和组合数。#include<iostream.h>longfactorial(intnumber);/Z函数原型,功能计算C(m,n)=A(m,n)/n!voidmain(){inti,selections,elements;coutくくNumberofselections:*;cin»selections;coutくくOutofhowmanyelements:*;cin»elements;doubleanswer=e1ements;for(i=l;i<selections;i++) /Z计算排列数A(m,n)=m*(m-l)*...*(m-n+l)answer*=——elements;coutくく“A('くくelements+selections-1くく,"«selections«")=";cout«answer«endl;answer/=factorial(selections);/Z调用factorial函数,以完成计算C(m,n)=A(m,n)/n!cout«"C("«elements+selections-l<<","«selections«")=";cout«answer«endl;)longfactorial(intnumber)/Z计算C(m,n)=A(m,n)/n!{longvalue=l;while(number>l)value*=number—;returnvalue;)程序运行结果如下:Nunberofselections:328Outofhowmanyelements:Aく28,3〉=19656C(28,3,=3276 说明:这个程序中很多地方使用了复合运算符,如*=、ー、++等,它们的使用有利于使程序简短、书写方便,不过应准确掌握其应用方法。*=是赋值符与=与乘法运算符・复合而成,它是ー种双止运算符,a*=b等价于a=a*b,也可以把它看作为a=a*b的简化写法。一和++称为减量和增量运算符,属于单目运算符。a一等价于a=a-l,一a也等价于a=a-La一与一a的区别只有当与其它运算共同组成表达式时オ能显现出来。例如answer*=—elements是ー个"运算“与”乘赋值“组合成的表达式,其运算顺序是:首先完成-一elements»即e1ements=e1ements-1然后完成answer*=e1ements»即answer=answer*e1ements设执行之前answer=20,elements=10,则执行answer*=—elements之后,首先令elements=9J然后answer=20*9=180.再来看一下value*=number一,运算顺序为:首先完成value*=number即value=value*number,然后完成number—.设执行前value=20,number=10J则执行value*=number―后,首先value=20*10=200,然后number=10-l=9.由此可以看出ー-a与a—;++a与a++之间的区别了。factorial()函数也可以采用递归函数的方式设计,即在函数体内又(直接或间接地)调用该函数本身,函数定义如下:longfactorial(intnumber){if(number<=l)return1;elsereturnnumber*factorial(number-1);)这个程序与n!的数学定义式1n<=ln+(n-1)!n>lC++关键字解释(l)auto这个这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto的0(2)register这个关键字命令编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提髙效率。(3)static常见的两种用途:1〉统计函数被调用的次数;2>减少局部数组建立和赋值的开销.变量的建立和赋值是需要一定的处理器开销的,特别是数组等含有较多元素的存储类型。在ー些含有较多的变量并且被经常调用的函数中,可以将一些数组声明为static类型,以减少建立或者初始化这些变量的开销.详细说明:1〉、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。2>、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。3>当static用来修饰全局变量时,它就改变了全局变量的作用域,使其不能被别的程序extern,限制在了当前文件里,但是没有改变其存放位置,还是在全局静态储存区。使用注意:1》若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;2》若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;3>设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题(只要输入数据相同就应产生相同的输出)(4)const被const修饰的东西都受到强制保护,可以预防意外的变动,能提髙程序的健壮性。它可以修饰函数的参数、返回值,甚至函数的定义体。作用:1》修饰输入参数a.对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用传递”,目的是提高效率。例如将voidFunc(Aa)改为voidFunc(constA&a)〇b.对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如voidFunc(intx)不应该改为voidFunc(constint&x)〇2>用const修饰函数的返回值a.如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。如对于:constchar*GetString(void);如下语句将出现编译错误:char*str=GetStringO;//cannotconvertfromJconstchar*'to'char*';正确的用法是:constchar*str=GetStringO;b.如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。如不要把函数intGetInt(void)写成constintGetlnt(void)〇3>const成员函数的声明中,const关键字只能放在函数声明的尾部,表示该类成员不修改对象.说明:consttypem;〃修饰m为不可改变示例:typedefchar*pStr:〃新的类型pStr;charstring[4]="abc";constchar*pl=string;pl++;〃正确,上边修饰的是・pl,pl可变constpStrp2=string;p2++;〃错误,上边修饰的是p2,p2不可变,*p2可变同理,const修饰指针时用此原则判断就不会混淆了。constint*value;〃*value不可变,value可变int*constvalue;〃value不可变,*value可变const(int*)value;//(int*)是ー种type,value不可变,*value可变〃逻辑上这样理解,编译不能通过,需要tydefin伊NewType;constint*constvalueノ/*value,value都不可变(5)volatile表明某个变量的值可能在外部被改变,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。它可以适用于基础类型如:int,char,long 也适用于C的结构和C++的类。当对结构或者类对象使用volatile修饰的时候,结构或者类的所有成员都会被视为volatile.该关键字在多线程环境下经常使用,因
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年广西工业职业技术学院单招职业适应性测试题库学生专用
- 2025年广州城建职业学院单招职业倾向性测试题库含答案
- 2025年湖南食品药品职业学院单招职业适应性测试题库参考答案
- 2025年海南职业技术学院单招职业倾向性测试题库带答案
- 2025年广西国际商务职业技术学院单招职业技能测试题库完整版
- 科技引领未来监狱安全生产管理的信息化升级
- 2025年湖北省荆门市单招职业倾向性测试题库1套
- 伟大的改革开放+学案- 高中政治统编版必修一中国特色社会主义
- 科技产品在电商平台上的推广策略
- 第6课《十六年前的回忆》教学设计 统编版(五四学制)(2024)语文六年级下册
- 地理-广东省上进联考领航高中联盟2025届高三下学期开学考试题和答案
- GB/T 20032-2024项目风险管理应用指南
- 博鳌亚洲论坛:创新报告2024
- 2025年全国青少年禁毒知识竞赛题库及答案(401一516) - 副本
- 2025年高三历史高考第二轮复习知识梳理中国史部分复习提纲
- 2025年蒙盐集团招聘笔试参考题库含答案解析
- 精神科医疗质控课件
- 护理三基三严习题+参考答案
- 椎间孔镜的手术配合
- 四大名著之红楼梦饮食文化
- 员工互评表(含指标)
评论
0/150
提交评论