C++试题及答案.doc_第1页
C++试题及答案.doc_第2页
C++试题及答案.doc_第3页
C++试题及答案.doc_第4页
C++试题及答案.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。(10分)请写出 BOOL flag 与“零值”比较的 if 语句。(3分) 标准答案: if ( flag ) if ( !flag ) 如下写法均属不良风格,不得分。 if (flag = TRUE) if (flag = 1 ) if (flag = FALSE) if (flag = 0) 请写出 float x 与“零值”比较的 if 语句。(4分) 标准答案示例:const float EPSINON = 0.00001;if (x = - EPSINON) & (x =”或“=”此类形式。如下是错误的写法,不得分。 if (x = 0.0) if (x != 0.0) 请写出 char *p 与“零值”比较的 if 语句。(3分) 标准答案: if (p = NULL) if (p != NULL) 如下写法均属不良风格,不得分。 if (p = 0) if (p != 0) if (p) if (!) 二、以下为Windows NT下的32位C+程序,请计算sizeof的值(10分)char str = “Hello” ; char *p = str ;int n = 10;请计算sizeof (str ) = 6 (2分) sizeof ( p ) = 4 (2分)sizeof ( n ) = 4 (2分) void Func ( char str100)请计算 sizeof( str ) = 4 (2分)void *p = malloc( 100 );请计算sizeof ( p ) = 4 (2分)for (i=0; iN; i+)if (condition) DoSomething();else DoOtherthing(); if (condition) for (i=0; iN; i+) DoSomething();else for (i=0; iN; i+) DoOtherthing(); 优点:程序简洁缺点:多执行了N-1次逻辑判断,并且打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。 优点:循环的效率高 缺点:程序不简洁请简述以下两个for循环的优缺点for (i=0; iN; i+)if (condition) DoSomething();else DoOtherthing(); if (condition)for (i=0; iN; i+) DoSomething();else for (i=0; i 6) ? puts( 6) : puts(6#define fn(n) printf(%c, %d, %c, %c, +(n), sizeof(+(n), +(n), (n) +1 );int main(int argc, char* argv) char n =a; fn(+n); return 0;答案:f, 1, f, gchar * const p;char const * pconst char *p上述三个有什么区别?char * const p; /常量指针,p的值不可以修改char const * p;/指向常量的指针,指向的常量值不可以改const char *p; /和char const *p定义一个宏:交换两个变量的值,不使用第三个变量有两种解法, 一种用算术算法, 一种用(异或)a = a + b;b = a - b;a = a - b; ora = ab;/ 只能对int,char.b = ab;a = ab;ora = b = a;如下程序运行有没有错?若有错,错在哪里?struct S int i; int* p; ; struct S a; int *p = &a.i; p0 = 1; p1 = 2; a.p = p; /这时,a.p的内容为p的地址,也就是指向结构a的起始地址 a.p1 = 10; /这句运行后,S-p = 10,也就是结构S的指针p指向了10这个地址 a.p0 = 12;/地址10+0的这个地址,不合法, 程序不能访问 union V struct X unsigned char s1:2; unsigned char s2:3; unsigned char s3:3; x; unsigned char c; v; v.c = 100; printf(%d, v.x.s3); 答案:3struct A char t:4; char k:4; unsigned short i:8; unsigned long m; sizeof(A)=?(不考虑边界对齐)答案:7在Win32下,程序输出是多少#pragma pack(8)union a int a_int1; double a_double; int a_int2;typedef struct a a1; char y; b;class c double c_double; b b1; a a2;输出coutsizeof(c)endl;的结果?答案:32逻辑题:一:0, 1, 3, 7, 15, 31的下一个数字是多少?631 某一密码仅使用K、L、M、N、O共5个字母,密码中的单词从左向右排列,密码单词必须遵循如下规则:(1) 密码单词的最小长度是两个字母,可以相同,也可以不同(2) K不可能是单词的第一个字母(3) 如果L出现,则出现次数不止一次(4) M不能使最后一个也不能是倒数第二个字母(5) K出现,则N就一定出现(6) O如果是最后一个字母,则L一定出现问题一:下列哪一个字母可以放在LO中的O后面,形成一个3个字母的密码单词?A) K B)L C) M D) N答案:L指针和引用有什么分别;如果传引用比传指针安全,为什么?如果我使用常量指针难道不行吗?(1) 引用在创建的同时必须初始化,即引用到一个有效的对象;而指针在定义的时候不必初始化,可以在定义后面的任何地方重新赋值(2) 不存在引用,引用必须与合法的存储单元关联;而指针则可以是NULL.(3) 引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用;而指针在任何时候都可以改变为指向另一个对象给引用赋值并不是改变它和原始对象的绑定关系(4) 引用的创建和销毁并不会调用类的拷贝构造函数(5) 语言层面,引用的用法和对象一样;在二进制层面,引用一般都是通过指针来实现的,只不过编译器帮我们完成了转换.不存在空引用,并且引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,显得很安全。const 指针仍然存在空指针,并且有可能产生野指针.总的来说:引用既具有指针的效率,又具有变量使用的方便性和直观性构造函数可否是虚函数,为什么?析构函数呢,可否是纯虚的呢?构造函数不能为虚函数,要构造一个对象,必须清楚地知道要构造什么,否则无法构造一个对象。析构函数可以为纯虚函数。关键字volatile有什么含意?并给出三个不同的例子。一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:1) 并行设备的硬件寄存器(如:状态寄存器)2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)3) 多线程应用中被几个任务共享的变量static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?答:全局变量(外部变量)的说明之前再冠以 static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。 从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。 static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件 static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用; static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值; static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝STL中的vector和list的区别,它们各适用在什么场合?进程和线程的差别。线程是指进程内的一个执行单元,也是进程内的可调度实体.与进程的区别:(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源. (4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。说说测试驱动开发的一般步骤。谈谈你对极限编程的理解列出你常使用的设计模式,并用代码实现一个。1. 关键字static的作用是什么?在C语言中,关键字static有三个明显的作用:1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。 2.const最经常的用法 1.为了防止传递的函数参数不被修改,在调用函数的形参中用const关键字.2.const可以用来创建数组常量、指针常量、指向常量的指针等const int a; /前两个的作用是一样,a是一个常整型数。int const a; const int *a; /第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。int * const a;int const * a const; /第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。/注:const并不会阻止参数的修改3.下面的代码输出是什么,为什么?void foo(void) unsigned int a = 6; int b = -20; (a+b 6) ? puts( 6) : puts(= 6);/当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。4.#define dPS struct s *typedef struct s * tPS;以上两种情况的意图都是要定义dPS 和 tPS 作为一个指向结构s指针。哪种方法更好呢?(如果有的话)为什么?这是一个非常微妙的问题,任何人答对这个问题(正当的原因)是应当被恭喜的。答案是:typedef更好。思考下面的例子:dPS p1,p2;tPS p3,p4;第一个扩展为struct s * p1, p2;.上面的代码定义p1为一个指向结构的指,p2为一个实际的结构,这也许不是你想要的。第二个例子正确地定义了p3 和p4 两个指针。晦涩的语法5.int a = 5, b = 7, c;c = a+b;/c = a+ + b;这段代码持行后a = 6, b = 7, c = 12。6写出判断ABCD四个表达式的是否正确, 若正确, 写出经过表达式中 a的值(3分)int a = 4;(A)a += (a+); (B) a += (+a) ;(C) (a+) += a;(D) (+a) += (a+);a = ?答:C错误,左侧不是一个有效变量,不能赋值,可改为(+a) += a;改后答案依次为9,10,10,117.头文件中的 ifndef/define/endif 干什么用?预处理答:防止头文件被重复引用8. switch()中不允许的数据类型是?答:实型9.编写strcat函数(6分)已知strcat函数的原型是char *strcat (char *strDest, const char *strSrc);其中strDest 是目的字符串,strSrc 是源字符串。(1)不调用C+/C 的字符串库函数,请编写函数 strcat答:VC源码:char * _cdecl strcat (char * dst, const char * src)char * cp = dst;while( *cp )cp+; /* find end of dst */while( *cp+ = *src+ ) ; /* Copy src to end of dst */return( dst ); /* return dst */(2)strcat能把strSrc 的内容连接到strDest,为什么还要char * 类型的返回值?答:方便赋值给其他变量10.回答下面的问题(6分)(1).Void GetMemory(char *p, int num)*p = (char *)malloc(num);void Test(void)char *str = NULL;GetMemory(&str, 100);strcpy(str, hello);printf(str);请问运行Test 函数会有什么样的结果?答:输出“hello”(2). void Test(void)char *str = (char *) malloc(100);strcpy(str, “hello”);free(str);if(str != NULL)strcpy(str, “world”);printf(str);请问运行Test 函数会有什么样的结果?答:输出“world”(3). char *GetMemory(void)char p = hello world;return p;void Test(void)char *str = NULL;str = GetMemory();printf(str);请问运行Test 函数会有什么样的结果?答:无效的指针,输出不确定 11.程序什么时候应该使用线程,什么时候单线程效率高。答:1耗时的操作使用线程,提高应用程序响应2并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求。3多CPU系统中,使用线程提高CPU利用率4改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。其他情况都使用单线程。12.C+中什么数据分配在栈或堆中,New分配数据是在近堆还是远堆中?答:栈: 存放局部变量,函数调用参数,函数返回值,函数返回地址。由系统管理堆: 程序运行时动态申请,new 和malloc申请的内存就在堆上13.int i=10, j=10, k=3; k*=i+j; k最后的值是?答:60,此题考察优先级,实际写成: k*=(i+j);,赋值运算符优先级最低14.ICMP是什么协议,处于哪一层?答:Internet控制报文协议,处于网络层(IP层)15.全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 全局变量储存在静态数据库,局部变量在堆栈。17.-1,2,7,28,126请问28和126中间那个数是什么?为什么?第一题的答案应该是43-1=63规律是n3-1(当n为偶数0,2,4) n3+1(当n为奇数1,3,5)18Heap与stack的差别。Heap是堆,stack是栈。Stack的空间由操作系统自动分配/释放,Heap上的空间手动分配/释放。Stack空间有限,Heap是很大的自由存储区C中的malloc函数分配的内存空间即在堆上,C+中对应的是new操作符。程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行19.用宏定义写出swap(x,y) /如果把较长的宏定义分成干行,须在待续的行末尾加上#define swap(x,y) x=x+y;y=x-y;x=x-y 注意:结尾没有;20一个指针为4个字节 int *p; printf(%d,sizeof(p);/输出: 4void Func(char str100)printf(%dn, sizeof(str);答:4分析:指针长度一个32位的机器,该机器的指针是多少位指针是多少位只要看地址总线的位数就行了。80386以后的机子都是32的数据总线。所以指针的位数就是4个字节了。21.main() int a5=1,2,3,4,5; int *ptr=(int *)(&a+1); /ptr实际是&(a5),也就是a+5 printf(%d,%d,*(a+1),*(ptr-1);输出:2,5*(a+1)就是a1,*(ptr-1)就是a4,执行结果是2,5&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)int *ptr=(int *)(&a+1); 则ptr实际是&(a5),也就是a+5原因如下:&a是数组指针,其类型为 int (*)5;而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同 .a是长度为5的int数组指针,所以要加 5*sizeof(int)所以ptr实际是a5 .但是ptr与(&a+1)类型是不一样的(这点很重要)所以prt-1只会减去sizeof(int*)a,&a的地址是一样的,但意思不一样,a是数组首地址,也就是a0的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a1,&a+1是下一个对象的地址,即a5.22.1)给定结构struct A char t:4; char k:4; unsigned short i:8; unsigned long m;问sizeof(A) = ?给定结构struct A char t:4; 4位 char k:4; 4位 unsigned short i:8; 8位 unsigned long m; / 偏移2字节保证4字节对齐; / 共8字节23./输出结果: 15#includeint main(void) char aa10; printf(%d,strlen(aa); return 0;24.C和C+有什么不同?从机制上:c是面向过程的(但c也可以编写面向对象的程序);c+是面向对象的,提供了类。但是,c+编写面向对象的程序比c容易从适用的方向:c适合要求代码体积小的,效率高的场合,如嵌入式;c+适合更上层的,复杂的; llinux核心大部分是c写的,因为它是系统软件,效率要求极高。从名称上也可以看出,c+比c多了+,说明c+是c的超集;那为什么不叫c+而叫c+呢,是因为c+比c来说扩充的东西太多了,所以就在c后面放上两个+;于是就成了c+C语言是结构化编程语言,C+是面向对象编程语言。C+侧重于对象而不是过程,侧重于类的设计而不是逻辑的设计。25 &和&的区别。 &是位运算符。&是布尔逻辑运算符。 26,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) .short s1 = 1; s1 += 1正确。 27.17.在不用第三方参数的情况下,交换两个参数的值#include void main() int i=60; int j=50; i=i+j; j=i-j; i=i-j; printf(i=%dn,i); printf(j=%dn,j);方法二:i=j;j=i;i=j;方法三:/ 用加减实现,而且不会溢出a = a+b-(b=a)28.假设你有8个球,其中一个略微重一些,但是找出这个球的惟一方法是将两个球放在天平上对比。最少要称多少次才能找出这个较重的球? 答:2次就可以了,方法:将其分成3堆,分别是3个、3个、2个。第一次天平两边各放3个,会有两种情况,一、两边持平一样重,那较重的球则不在里面,那就把剩下的两个称一下就能找到较重那个了。第二种情况是有一边较重,那较重的球就在较重那边的3个之中,第二次称就是就在这3个之中拿出两个来比较,也有两种情况,持平则较重的是没放进去称的那个,有一边较重则那个就是较重的。一、选择题1由C+目标文件连接而成的可执行文件的缺省扩展名为 。 A cpp B. exe C obj D. lik2在下面的一维数组定义中,哪一个有语法错误。 A. int a =1,2,3 B. int a10=0 C. int a D. int a53在下面的函数声明中,存在着语法错误的是 。 A. void BC(int a , int) B. void BD(int , int) C. void BE(int , int=5) D. int BF(int x ; int y)4. 假定AB为一个类,则该类的拷贝构造函数的声明语句为 。 A AB &(AB x) B. AB(AB x) C AB(AB &) D. AB(AB * x)5对于结构中定义的成员,其隐含访问权限为 。 A public B. protected C private D. static6当使用fstream流类定义一个流对象并打开一个磁盘文件时,文件的隐含打开方式为 。 A ios:in B. ios:out C ios:int | ios:out D. 没有二、填空题1执行“cout 43-18=43-18endl;”语句后得到的输出结果为 。2已知AZ的ASCII码为6590,当执行“char ch=14*5+2; cout chy和x=y的逻辑值分别为 和 。6执行“typedef int ABC10;”语句把ABC定义为具有10个整型元素的 。7假定p所指对象的值为25,p+1所指对象的值为46,则执行“(*p)+;”语句后,p所指对象的值为 。8假定一个二维数组为aMN,则ai的地址值(以字节为单位)为 。9假定要访问一个结构指针p所指对象中的b指针成员所指的对象,则表示方法为 。10设px是指向一个类动态对象的指针变量,则执行“delete px;”语句时,将自动调用该类的 。11若需要把一个函数“void F( );”定义为一个类AB的友元函数,则应在类AB的定义中加入一条语句: 。12若要在程序文件中进行标准输入输出操作,则必须在开始的 # include 命令中使用 头文件。三、下列程序运行后的输出结果1 # include void main() int s=0; for (int i=1; ; i+) if (s50) break; if (i%2=0) s+=i; cout i,s=i,sendl;2 # include void main() char a=abcdabcabfgacd; int i1=0,i2=0,i=0; while (ai) if (ai=a) i1+; if (ai=b) i2+; i+; cout i1 i2endl;3 # include void main() int a9=2,4,6,8,10,12,14,16,18; for (int i=0; i9; i+) cout setw(5)*(a+i); if (i+1)%3=0) cout endl; 4 # include void LE(int * a,int * b) int x=*a; *a=*b; *b=x; cout *a *bendl;void main() int x=10,y=25; LE(&x,&y); cout x yendl;5 # include class A int a,b;public : A() a=b=0; A(int aa,int bb) a=aa; b=bb; cout a bendl; ;void main() A x,y(2,3),z(4,5);6 # include template class FF TT a1,a2,a3;public : FF(TT b1,TT b2,TT b3) a1=b1; a2=b2; a3=b3; TT Sum() retur

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论