关闭

关闭

关闭

封号提示

内容

首页 整理的C++笔试题.doc

整理的C++笔试题.doc

整理的C++笔试题.doc

上传者: hao123 2012-07-05 评分 0 0 0 0 0 0 暂无简介 简介 举报

简介:本文档为《整理的C++笔试题doc》,可适用于IT/计算机领域,主题内容包含一:链表题目.实现双向链表删除一个节点P在节点P后插入一个节点写出这两个函数。.写出程序把一个链表中的接点顺序倒排.写出程序删除链表中的所有接点二:符等。

一:链表题目.实现双向链表删除一个节点P在节点P后插入一个节点写出这两个函数。.写出程序把一个链表中的接点顺序倒排.写出程序删除链表中的所有接点二:函数题目.如何定义和实现一个类的成员函数为回调函数?.C里面是不是所有的动作都是main()引起的?如果不是请举例。.C里面如何声明constvoidf(void)函数为C程序中的库函数?.内联函数在编译时是否做参数类型检查?三:常考的关键字.const下列哪两个是等同的intbAconstint*a=bBconst*inta=bCconstint*consta=bDintconst*consta=bconst与#define有什么不同答案: const常量有数据类型而宏没有数据类型。编译器可以对const常量进行类型检查而对宏只进行字符替换没有类型检查。       有些编译器可以对const常量进行调试但不能对宏常量进行调试const可以用来修饰函数参数、函数返回值C还可以用来修饰函数定义内中某个成员函数为常量函数const 符号常量()const char *p()char const *p()char * const p说明上面三种描述的区别:和相同如果const位于星号的左侧则const就是用来修饰指针所指向的变量即指针指向为常量不能修改指针指向对象的内容如果const位于星号的右侧const就是修饰指针本身即指针本身是常量不能修改指针的指向.Sizeof对于structs{charaintb} sizeof(s)=因为当结构体内元素长度都小于处理器位数(位=字节)的时候便以结构体中最长的数据元素为对齐条件,a按字节对齐b按字节对齐所以s默认对其参数为  structA{shortashortashorta}sizeof(A)=原因同上结构体按最长元素short(字节对齐)。对于空的类进行评测 classA{} sizeof(A)=默认空类是有一个占位符的 对于虚函数classA{virtualtest()}classB:publicA{}sizeof(A)=sizeof(B)=任何含有虚函数的类拥有一个vptr指针用来指向虚函数表vtable。sizeof(vptr)= classA{staticinta}sizeof(A)=对于静态成员变量是分配在全局存储区的所以A还是相当于空类。classC:publicvirtualA{}sizeof(C)=对于虚拟继承的类拥有虚函数表所以空类C含有vptr使用malloc或者new分配内存void*pp  = malloc() sizeof(p)=跟指针一样,sizeof只能测出静态数组的长度无法检测动态分配的或外部数组大小.Staticstatic有什么用途?(请至少说明两种))在函数体一个被声明为静态的变量在这一函数被调用过程中维持其值不变。)在模块内(但在函数体外)一个被声明为静态的变量可以被模块内所用函数访问但不能被模块外其它函数访问。它是一个本地的全局变量。)在模块内一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是这个函数被限制在声明它的模块的本地范围内使用。四:名词解释和作用.引用什么是“引用”?申明和使用“引用”要注意哪些问题?引用就是某个目标变量的“别名”(alias)对应用的操作与对变量直接操作效果完全相同。申明一个引用的时候切记要对其进行初始化。引用声明完毕后相当于目标变量名有两个名称即该目标原名称和引用名不能再把该引用名作为其他变量名的别名。声明一个引用不是新定义了一个变量它只表示该引用名是目标变量名的一个别名它本身不是一种数据类型因此引用本身不占存储单元系统也不给引用分配存储单元。不能建立数组的引用。将“引用”作为函数参数有哪些特点?()传递引用给函数与传递指针的效果是一样的。这时被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。()使用引用传递函数的参数在内存中并没有产生实参的副本它是直接对实参操作而使用一般变量传递函数的参数当发生函数调用时需要给形参分配存储单元形参变量是实参变量的副本如果传递的是对象还将调用拷贝构造函数。因此当参数传递的数据较大时用引用比用一般变量传递参数的效率和所占空间都好。()使用指针作为函数的参数虽然也能达到与使用引用的效果但是在被调函数中同样要给形参分配存储单元且需要重复使用"*指针变量名"的形式进行运算这很容易产生错误且程序的阅读性较差另一方面在主调函数的调用点处必须用变量的地址作为实参。而引用更容易使用更清晰。在什么时候需要使用“常引用”?如果既要利用引用提高程序的效率又要保护传递给函数的数据不在函数中被改变就应使用常引用。常引用声明方式:const类型标识符引用名=目标变量名例intaconstintra=ara=错误a=正确例stringfoo()voidbar(strings)那么下面的表达式将是非法的:bar(foo())bar("helloworld")原因在于foo()和"helloworld"串都会产生一个临时对象而在C中这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型这是非法的。引用型参数应该在能被定义为const的情况下尽量定义为const。将“引用”作为函数返回值类型的格式、好处和需要遵守的规则格式:类型标识符函数名(形参列表及类型说明){函数体}好处:在内存中不产生被返回值的副本(注意:正是因为这点原因所以返回一个局部变量的引用是不可取的。因为随着该局部变量生存期的结束相应的引用也会失效产生runtimeerror!注意事项:()不能返回局部变量的引用。这条可以参照EffectiveC的Item。主要原因是局部变量会在函数返回后被销毁因此被返回的引用就成为了"无所指"的引用程序会进入未知状态。()不能返回函数内部new分配的内存的引用。这条可以参照EffectiveC的Item。虽然不存在局部变量的被动销毁问题可对于这种情况(返回函数内部new分配内存的引用)又面临其它尴尬局面。例如被函数返回的引用只是作为一个临时变量出现而没有被赋予一个实际的变量那么这个引用所指向的空间(由new分配)就无法释放造成memoryleak。()可以返回类成员的引用但最好是const。这条原则可以参照EffectiveC的Item。主要原因是当对象的属性是与某种业务规则(businessrule)相关联的时候其赋值常常与某些其它属性或者对象的状态有关因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常量引用(或指针)那么对该属性的单纯赋值就会破坏业务规则的完整性。()流操作符重载返回值申明为“引用”的作用:流操作符<<和>>这两个操作符常常希望被连续使用例如:cout<<"hello"<<endl 因此这两个操作符的返回值应该是一个仍然支持这两个操作符的流引用。可选的其它方案包括:返回一个流对象和返回一个流对象指针。但是对于返回一个流对象程序必须重新(拷贝)构造一个新的流对象也就是说连续的两个<<操作符实际上是针对不同对象的!这无法让人接受。对于返回一个流指针则不能连续使用<<操作符。因此返回一个流对象引用是惟一选择。这个唯一选择很关键它说明了引用的重要性以及无可替代性也许这就是C语言中引入引用这个概念的原因吧。赋值操作符=。这个操作符象流操作符一样是可以连续使用的例如:x=j=或者(x=)=赋值操作符的返回值必须是一个左值以便可以被继续赋值。因此引用成了这个操作符的惟一返回值选择。例#include<iostreamh>intput(intn)intvalsinterror=voidmain(){put()=以put()函数值作为左值等价于vals=put()=以put()函数值作为左值等价于vals=cout<<valscout<<vals}intput(intn){if(n>=n<=)returnvalsnelse{cout<<"subscripterror"returnerror}}()在另外的一些操作符中却千万不能返回引用:*四则运算符。它们不能返回引用EffectiveC的Item详细的讨论了这个问题。主要原因是这四个操作符没有sideeffect因此它们必须构造一个对象作为返回值可选的方案包括:返回一个对象、返回一个局部变量的引用返回一个new分配的对象的引用、返回一个静态对象引用。根据前面提到的引用作为返回值的三个规则第、两个方案都被否决了。静态对象的引用又因为((ab)==(cd))会永远为true而导致错误。所以可选的只剩下返回一个对象了。“引用”与多态的关系?引用是除指针外另一个可以产生多态效果的手段。这意味着一个基类的引用可以指向它的派生类实例。例ClassAClassB:ClassA{}BbAref=b“引用”与指针的区别是什么?指针通过某个指针变量指向一个对象后对它所指向的变量间接操作。程序中使用指针程序的可读性差而引用本身就是目标变量的别名对引用的操作就是对目标变量的操作。此外就是上面提到的对函数传ref和pointer的区别。什么时候需要“引用”?流操作符<<和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。以上参考:http:blogcsdnnetwfwdarchiveaspx引用与指针有什么区别?)引用必须被初始化不存在指向空值的引用一个引用必须指向某个对象。指针不必立即初始化。)引用初始化以后不能改变使其指向其他对象但可以修改其指向对象的内容。指针可以被改变指向其他的对象。)在使用引用之前不需要测试它是否为空相反指针应该总被测试防止其为空。)重载操作符必须使用引用才能完成串式操作.面向对象的三个基本特征并简单叙述之?a)封装:将客观事物抽象成类每个类对自身的数据和方法实行protection(private,protected,public)b)继承:广义的继承有三种实现形式:实现继承(指使用基类的属性和方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法实现滞后到子类实现)。前两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)构成了功能复用的两种方式。c)多态:是将父对象设置成为和一个或更多的他的子对象相等的技术赋值之后父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说就是一句话:允许将子类类型的指针赋值给父类类型的指针。.重载(overload)和重写(overried有的书也叫做“覆盖”)的区别?a)成员函数被重载的特征:()相同的范围(在同一个类中)()函数名字相同()参数不同()virtual关键字可有可无。b)覆盖是指派生类函数覆盖基类函数特征是:()不同的范围(分别位于派生类与基类)()函数名字相同()参数相同()基类函数必须有virtual关键字。c)“隐藏”是指派生类的函数屏蔽了与其同名的基类函数规则如下:()如果派生类的函数与基类的函数同名但是参数不同。此时不论有无virtual关键字基类的函数将被隐藏(注意别与重载混淆)。()如果派生类的函数与基类的函数同名并且参数也相同但是基类函数没有virtual关键字。此时基类的函数被隐藏(注意别与覆盖混淆).Newdelete与mallocfree的联系与区别a)都是在堆(heap)上进行动态的内存操作。用malloc函数需要指定内存分配的字节数并且不能初始化对象new会自动调用对象的构造函数。delete会调用对象的destructor而free不会调用对象的destructor.struct和class的区别?a)struct的成员默认是公有的而类的成员默认是私有的。struct和class在其他方面是功能相当的。从感情上讲大多数的开发者感到类和结构有很大的差别。感觉上结构仅仅象一堆缺乏封装和功能的开放的内存位而类就象活的并且可靠的社会成员它有智能服务有牢固的封装屏障和一个良好定义的接口。既然大多数人都这么认为那么只有在你的类有很少的方法并且有公有数据(这种事情在良好设计的系统中是存在的!)时你也许应该使用struct关键字否则你应该使用class关键字。.请说出const与#define相比有何优点?Const作用:定义常量、修饰函数参数、修饰函数返回值三个作用。被Const修饰的东西都受到强制保护可以预防意外的变动能提高程序的健壮性。)const常量有数据类型而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换没有类型安全检查并且在字符替换可能会产生意料不到的错误。     )有些集成化的调试工具可以对const常量进行调试但是不能对宏常量进行调试。.什么构造函数不能声明为虚函数?答案:虚函数采用一种虚调用的办法。虚调用是一种可以在只有部分信息的情况下工作的机制,特别允许我们调用一个只知道接口而不知道其准确对象类型的函数。但如果要创建一个对象势必要知道其准确类型因此构造函数不能为虚。.c和c中的struct有什么不同?c和c中struct的主要区别是c中的struct不可以含有成员函数而c中的struct可以。c中struct和class的主要区别在于默认的存取权限不同struct默认为public而class默认为private纯虚函数如何定义?使用时应注意什么?virtualvoidf()=是接口子类必须要实现“引用”与指针的区别是什么?指针通过某个指针变量指向一个对象后对它所指向的变量间接操作。程序中使用指针程序的可读性差而引用本身就是目标变量的别名对引用的操作就是对目标变量的操作。此外就是上面提到的对函数传ref和pointer的区别。.结构与联合有和区别?()结构和联合都是由多个不同的数据类型成员组成,但在任何同一时刻,联合中只存放了一个被选中的成员(所有成员共用一块地址空间),而结构的所有成员都存在(不同成员的存放地址不同)。  ()对于联合的不同成员赋值,将会对其它成员重写, 原来成员的值就不存在了,而对于结构的不同成员赋值是互不影响的。.多态的作用?主要是两个:隐藏实现细节使得代码能够模块化扩展代码模块实现代码重用接口重用:为了类在继承和派生的时候保证使用家族中任一类的实例的某一属性时的正确调用。.描述内存分配方式以及它们的区别)从静态存储区域分配。内存在程序编译的时候就已经分配好这块内存在程序的整个运行期间都存在。例如全局变量static变量。)在栈上创建。在执行函数时函数内局部变量的存储单元都可以在栈上创建函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。)从堆上分配亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存程序员自己负责在何时用free或delete释放内存。动态内存的生存期由程序员决定使用非常灵活但问题也最多。.h头文件中的ifndefdefineendif的作用?防止该头文件被重复引用。.局部变量能否和全局变量重名?能局部会屏蔽全局。要用全局变量需要使用"::"局部变量可以与全局变量同名在函数内引用这个变量时会用到同名的局部变量而不会用到全局变量。对于有些编译器而言在同一个函数内可以定义多个同名的局部变量比如在两个循环体内都定义一个同名的局部变量而那个局部变量的作用域就在那个循环体内.全局变量可不可以定义在可被多个C文件包含的头文件中?为什么?可以在不同的C文件中以static形式来声明同名全局变量。可以在不同的C文件中声明同名的全局变量前提是其中只能有一个C文件中对此变量赋初值此时连接不会出错.用两个栈实现一个队列的功能?要求给出算法和思路!设个栈为A,B,一开始均为空入队:将新元素push入栈A出队:()判断栈B是否为空()如果不为空则将栈A中所有元素依次pop出并push到栈B()将栈B的栈顶元素pop出这样实现的队列入队和出队的平摊复杂度都还是O(),比上面的几种方法要好。.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C中应用什么实现c用宏定义c用inline.用变量a给出下面的定义a)一个整型数(Aninteger)b)一个指向整型数的指针(Apointertoaninteger)c)一个指向指针的的指针它指向的指针是指向一个整型数(Apointertoapointertoaninteger)d)一个有个整型数的数组(Anarrayofintegers)e)一个有个指针的数组该指针是指向一个整型数的(Anarrayofpointerstointegers)f)一个指向有个整型数数组的指针(Apointertoanarrayofintegers)g)一个指向函数的指针该函数有一个整型参数并返回一个整型数(Apointertoafunctionthattakesanintegerasanargumentandreturnsaninteger)h)一个有个指针的数组该指针指向一个函数该函数有一个整型参数并返回一个整型数(Anarrayoftenpointerstofunctionsthattakeanintegerargumentandreturnaninteger)答案是:a)intaAnintegerb)int*aApointertoanintegerc)int**aApointertoapointertoanintegerd)intaAnarrayofintegerse)int*aAnarrayofpointerstointegersf)int(*a)Apointertoanarrayofintegersg)int(*a)(int)Apointertoafunctionathattakesanintegerargumentandreturnsanintegerh)int(*a)(int)Anarrayofpointerstofunctionsthattakeanintegerargumentandreturnaninteger.什么是预编译,何时需要预编译预编译又称为预处理,是做些代码文本的替换工作。处理#开头的指令,比如拷贝#include包含的文件代码#define宏定义的替换,条件编译等就是为编译做的预备工作的阶段主要处理#开始的预编译指令预编译指令指示了在程序正式编译前就由编译器进行的操作可以放在程序中的任何位置。c编译系统在对程序进行通常的编译之前先进行预处理。c提供的预处理功能主要有以下三种:)宏定义 )文件包含 )条件编译1、总是使用不经常改动的大型代码体。2、程序由多个模块组成所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下可以将所有包含文件预编译为一个预编译头。.进程和线程的区别什么是进程(Process):普通的解释就是进程是程序的一次执行而什么是线程(Thread)线程可以理解为进程中的执行的一段程序片段。在一个多任务环境中下面的概念可以帮助我们理解两者间的差别:进程间是独立的这表现在内存空间上下文环境线程运行在进程空间内。一般来讲(不使用特殊技术)进程是无法突破进程边界存取其他进程内的存储空间而线程由于处于进程空间内所以同一进程所产生的线程共享同一内存空间。同一进程中的两段代码不能够同时执行除非引入线程。线程是属于进程的当进程退出时该进程所产生的线程都会被强制退出并清除。线程占用的资源要少于进程所占用的资源。进程和线程都可以有优先级。在线程系统中进程也是一个线程。可以将进程理解为一个程序的第一个线程。线程是指进程内的一个执行单元,也是进程内的可调度实体与进程的区别:()地址空间:进程内的一个执行单元进程至少有一个线程它们共享进程的地址空间而进程有自己独立的地址空间()进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源()线程是处理器调度的基本单位,但进程不是()二者均可并发执行.交换两个数的宏定义交换两个参数值的宏定义为:#defineSWAP(a,b)(a)=(a)(b)(b)=(a)(b)(a)=(a)(b).有关重载函数返回值类型不同构不成重载参数参数顺序不同能构成重载c函数同名不同返回值不算重载!函数重载是忽略返回值类型的。成员函数被重载的特征有:)相同的范围(在同一个类中))函数名字相同)参数不同)virtual关键字可有可无。)成员函数中有无const(函数后面)也可判断是否重载.多态的作用?主要是两个:隐藏实现细节使得代码能够模块化扩展代码模块实现代码重用接口重用:为了类在继承和派生的时候保证使用家族中任一类的实例的某一属性时的正确调用。.C是不是类型安全的?不是。两个不同类型的指针之间可以强制转换(用reinterpretcast)。C#是类型安全的。.main函数执行以前还会执行什么代码?全局对象的构造函数会在main函数之前执行。.是不是一个父类写了一个virtual函数如果子类覆盖它的函数不加virtual,也能实现多态virtual修饰符会被隐形继承的。private也被集成只事派生类没有访问权限而已。virtual可加可不加。子类的空间里有父类的所有变量(static除外)。同一个函数只存在一个实体(inline除外)。子类覆盖它的函数不加virtual,也能实现多态。在子类的空间里有父类的私有变量。私有变量不能直接访问。.C中的空类默认产生哪些类成员函数?答:classEmpty{public:Empty()缺省构造函数Empty(constEmpty)拷贝构造函数~Empty()析构函数Emptyoperator=(constEmpty)赋值运算符Empty*operator()取址运算符constEmpty*operator()const取址运算符const}五:关于类的题目.已知String类定义如下:classString{public:String(constchar*str=)通用构造函数String(constStringanother)拷贝构造函数~String()析构函数Stringoperater=(constStringrhs)赋值函数private:char*mdata用于保存字符串}尝试写出类的成员函数实现。.C是不是类型安全的?.当一个类A中没有任何成员变量与成员函数,这时sizeof(A)的值是多少如果不是零请解释一下编译器为什么没有让它为零。.类成员函数的重载、覆盖和隐藏区别?重载:是指允许存在多个同名函数而这些函数的参数表不同(或许参数个数不同或许参数类型不同或许两者都不同)。重写:是指子类重新定义复类虚函数的方法。从实现原理上来说:重载:编译器根据函数不同的参数表对同名函数的名称做修饰然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如有两个同名函数:functionfunc(p:integer):integer和functionfunc(p:string):integer。那么编译器做过修饰后的函数名称可能是这样的:intfunc、strfunc。对于这两个函数的调用在编译器间就已经确定了是静态的。也就是说它们的地址在编译期就绑定了(早绑定)因此重载和多态无关!重写:和多态真正相关。当子类重新定义了父类的虚函数后父类指针根据赋给它的不同的子类指针动态的调用属于子类的该函数这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此这样的函数地址是在运行期绑定的(晚绑定)。.已知String类定义如下:classString{public:String(constchar*str=)通用构造函数String(constStringanother)拷贝构造函数~String()析构函数Stringoperater=(constStringrhs)赋值函数private:char*mdata用于保存字符串}尝试写出类的成员函数实现。答案:String::String(constchar*str){if(str==)strlen在参数为时会抛异常才会有这步判断{mdata=newcharmdata=''}else{mdata=newcharstrlen(str)strcpy(mdata,str)}}String::String(constStringanother){mdata=newcharstrlen(anothermdata)strcpy(mdata,othermdata)}StringString::operator=(constStringrhs){if(this==rhs)return*thisdeletemdata删除原来的数据新开一块内存mdata=newcharstrlen(rhsmdata)strcpy(mdata,rhsmdata)return*this}String::~String(){deletemdata}六:编写程序.文件中有一组整数要求排序后输出到另一个文件中#include<iostream>#include<fstream>usingnamespacestdvoidOrder(vector<int>data)bubblesort{intcount=datasize()inttag=false设置是否需要继续冒泡的标志位for(inti=i<counti){for(intj=j<countij){if(dataj>dataj){tag=trueinttemp=datajdataj=datajdataj=temp}}if(!tag)break}}voidmain(void){vector<int>dataifstreamin("c:datatxt")if(!in){cout<<"fileerror!"exit()}inttempwhile(!ineof()){in>>tempdatapushback(temp)}inclose()关闭输入文件流Order(data)ofstreamout("c:resulttxt")if(!out){cout<<"fileerror!"exit()}for(i=i<datasize()i)out<<datai<<""outclose()关闭输出文件流}.写一个函数找出一个整数数组中第二大的数(microsoft).编程实现:找出两个字符串中最大公共子字符串,如"abccade","dgcadde"的最大子串为"cad".实现strcpy函数char *strcpy(char *destination, const char *source){   assert(destination!=source!=)   char*target=destinaton   while(*destinaton=*source)   returntarget}出现次数相当频繁.实现strcmp函数intstrcmp(char*l,char*r){   assert(l!=r!=)   while(*l==*r*l!='')l,r   if(*l>*r)      return   elseif(*l==*r)      return   return}.实现字符串翻转voidreserve(char*str){   assert(str!=)   char*p=str   char*p=str   while(*p)        一般要求不能使用strlen   p=   while(p<p)   {      charc=*p      *p=*p      *p=c  }}.用指针的方法将字符串“ABCDefgh”前后对调显示不要用strlen求字符串长度这样就没分了代码如下:   charstr="ABCDefgh"   char*p=str   char*p=str   while(*p)   p=   while(p<p)   {      charc=*p      *p=*p      *p=c   }.输入N,打印N*N矩阵比如N=打印:螺旋矩阵      N=打印:                 解答:#defineNintsNNvoidmain(){   intk=,i=,j=   inta=   for(k<(N)k)   {      while(j<Nk)sij=aij      while(i<Nk)sij=aij      while(j>k)sij=aij      while(i>k)  sij=aij   }   for(i=i<Ni)   {      for(j=j<Nj)      cout<<sij<<'t'      cout<<endl   }}七:其他题目.如何打印出当前源文件的文件名以及源文件的当前行号?a)cout<<FILEcout<<LINEFILE和LINE是系统预定义宏这种宏并不是在某个文件中定义的而是由编译器定义的。.main主函数执行完毕后是否可能会再执行一段代码给出说明?(可以可以用onexit注册一个函数它会在main之后执行intfn(void),fn(void),fn(void),fn(void)可以可以用onexit注册一个函数它会在main之后执行intfn(void),fn(void),fn(void),fn(void)voidmain(void){Stringstr("zhanglin")onexit(fn)onexit(fn)onexit(fn)onexit(fn)printf("Thisisexecutedfirstn")}intfn(){printf("nextn")return}intfn(){printf("executed")return}intfn(){printf("is")return}intfn(){printf("This")return}Theonexitfunctionispassedtheaddressofafunction(func)tobecalledwhentheprogramterminatesnormallySuccessivecallstoonexitcreatearegisteroffunctionsthatareexecutedinLIFO(lastinfirstout)orderThefunctionspassedtoonexitcannottakeparameters.如何判断一段程序是由C编译程序还是由C编译程序编译的?#ifdefcpluspluscout<<"c"#elsecout<<"c"#endif.要对绝对地址x赋值我们可以用(unsignedint*)x=那么要是想让程序跳转到绝对地址是x去执行应该怎么做?*((void(*)())x)()首先要将x强制转换成函数指针,即:(void(*)())x然后再调用它:*((void(*)())x)()用typedef可以看得更直观些:typedefvoid(*)()voidFuncPtr*((voidFuncPtr)x)().排序算法a)快速排序:intpartition(int*a,intl,intr){   inti=l,j=r,v=ar   while()   {      while(ai<v)      while(aj>v)if(j<=i)break      if(i>=j)         break      swap(ai,aj)   }   swap(ai,ar)   returni}voidqsort(int*a,intl,intr){   if(r>l)   {      inti=partition(a,l,r)      qsort(a,l,i)      qsort(a,i,r)   }}b)冒泡排序:出现次数相当频繁voidbuble(int*a,intn){   for(inti=i<ni)   {      for(intj=j<nij)      {         if(aj<aj)         {            inttemp=aj            aj=aj            aj=temp         }      }   }}c)插入排序:voidinsertsort(int*a,intn){   intkey   for(intj=j<nj)   {      key=aj      for(inti=ji>=ai>keyi)      {         ai=ai      }      ai=key   }}.分别写出BOOL,int,float,指针类型的变量a与“零”的比较语句。a)BOOL:if(!a)orif(a)int:if(a==)float:constEXPRESSIONEXP=if(a<EXPa>EXP)pointer:if(a!=)orif(a==).八:分析程序分析一下这段程序的输出(Autodesk)a)classB{public:B(){cout<<"defaultconstructor"<<endl}~B(){cout<<"destructed"<<endl}B(inti):data(i)B(int)worksasaconverter(int>instanceofB){cout<<"constructedbyparameter"<<data<<endl}private:intdata}BPlay(Bb){returnb}()results:intmain(intargc,char*argv)constructedbyparameter{destructedB()形参析构Bt=Play()Bt=Play(t) destructedt形参析构return              destructedt 注意顺序!}destructedt()results:intmain(intargc,char*argv)constructedbyparameter{destructedB()形参析构Bt=Play()Bt=Play() constructedbyparameterreturn              destructedB()形参析构}destructedt 注意顺序!destructedt下面代码有什么错误Voidtest(){ charstring,str for(i=i<i) {    stri='a' } strcpy(string,str)}数组越界下面代码有什么问题Voidtest(char*str){ charstring if(strlen(str)<=) {   strcpy(string,str) }}==数组越界==strcpy拷贝的结束标志是查找字符串中的因此如果字符串中没有遇到的话会一直复制直到遇到,上面的都因此产生越界的情况 建议使用strncpy和memcpy下面代码有什么问题#defineMAXSRMDSNgetSRMno(){ staticintSRMno是不是这里没赋初值? intI for(I=I<MAXSRMI,SRMno) {   SRMno=MAXSRM   if(MYSRMstate==IDLE)   {     break   } } if(I>=MAXSRM)   return(SRM) else   returnSRMno}系统会初始化staticint变量为,但该值会一直保存,所谓的不可重入.写出运行结果:{test   charstr="world"cout<<sizeof(str)<<":"   char*p   =str    cout<<sizeof(p)<<":"   chari    =     cout<<sizeof(i)<<":"   void*pp  =malloc() cout<<sizeof(p)<<endl}:::写出运行结果:{test   unionV{ structX{  unsignedchars:  unsignedchars:  unsignedchars: }x unsignedcharc   }v   vc=   printf("d",vxs)}用C写个程序如何判断一个操作系统是位还是位的?不能用sizeof()函数A:位的系统下inti=cout<<i输出inti=cout<<i输出位的系统下inti=cout<<i输出inti=cout<<i输出A:inta=~if(a>){   cout<<"bit"<<endl}else{   cout<<"bit"<<endl}在不用第三方参数的情况下交换两个参数的值#include<stdioh>voidmain(){       inti=       intj=       i=ij       j=ij       i=ij       printf("i=dn",i)       printf("j=dn",j)}方法二:i^=jj^=ii^=j方法三:用加减实现而且不会溢出a=ab(b=a)下面的代码有什么问题classA{public: A(){p=this} ~A(){if(p!=){deletepp=}}A*p}答:会引起无限递归i最后等于多少inti=intj=iif((i>j)(i==j))i=j答:i=classA{ virtualvoidfunc() voidfunc()}ClassB:classA{ voidfunc(){cout<<"funincla

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +2积分

资料评价:

/24
1下载券 下载 加入VIP, 送下载券

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部