常见C/C++笔试题目整理(含答案)1

来源:互联网 发布:vasp软件 编辑:程序博客网 时间:2024/05/16 18:50

网上流传的一份常见C++笔试题目汇总,供各位有找工作需要的同学参考之用,因为原文较长,遂采用连载形式,预计需要连载10期左右,有耐心的同学就请一直跟下去吧,相信一定会有所收获。提前说明一点,题目来在网络,答案仅供参考,如有同学觉得哪道题目有异议,欢迎讨论!

题目1-15

1.是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态?

virtual修饰符会被隐形继承的。private 也被继承,只是派生类没有访问权限而已。virtual可加可不加。子类的空间里有父类的所有变量(static除外)。同一个函数只存在一个实体(inline除外)。子类覆盖它的函数不加virtual ,也能实现多态。在子类的空间里,有父类的私有变量。私有变量不能直接访问。

--------------------------------------------------------------------------
2.输入一个字符串,将其逆序后输出。(使用C++,不建议用伪码)

#include <iostream>using namespace std;void main(){char a[50];memset(a,0,sizeof(a));int i=0,j;char t;cin.getline(a,50,'/n');for(i=0,j=strlen(a)-1;i<strlen(a)/2;i++,j--){   t=a[i];      a[i]=a[j];   a[j]=t;}cout<<a<<endl;}

//第二种
string str;cin>>str;str.replace;cout<<str;

--------------------------------------------------------------------------
3.请简单描述操作系统的内存管理方法。

内存管理是操作系统中的重要部分,两三句话恐怕谁也说不清楚吧~~
我先说个大概,希望能够抛砖引玉吧
当程序运行时需要从内存中读出这段程序的代码。代码的位置必须在物理内存中才能被运行,由于现在的操作系统中有非常多的程序运行着,内存中不能够完全放下,所以引出了虚拟内存的概念。把那些不常用的程序片断就放入虚拟内存,当需要用到它的时候在load入主存(物理内存)中。这个就是内存管理所要做的事。内存管理还有另外一件事需要做:计算程序片段在主存中的物理位置,以便CPU调度。

内存管理有块式管理,页式管理,段式和段页式管理。现在常用段页式管理。
块式管理:把主存分为一大块、一大块的,当所需的程序片断不在主存时就分配一块主存空间,把程 序片断load入主存,就算所需的程序片度只有几个字节也只能把这一块分配给它。这样会造成很大的浪费,平均浪费了50%的内存空间,但时易于管理。
页式管理:把主存分为一页一页的,每一页的空间要比一块一块的空间小很多,显然这种方法的空间利用率要比块式管理高很多。
段式管理:把主存分为一段一段的,每一段的空间又要比一页一页的空间小很多,这种方法在空间利用率上又比页式管理高很多,但是也有另外一个缺点。一个程序片断可能会被分为几十段,这样很多时间就会被浪费在计算每一段的物理地址上(计算机最耗时间的大家都知道是I/O吧)。
段页式管理:结合了段式管理和页式管理的优点。把主存分为若干页,每一页又分为若干段。好处就很明显,不用我多说了吧。
各种内存管理都有它自己的方法来计算出程序片断在主存中的物理地址,其实都很相似。
这只是一个大概而已,不足以说明内存管理的皮毛。无论哪一本操作系统书上都有详细的讲解。

--------------------------------------------------------------------------
4. 讨论下面代码的执行结果:

#include "stdafx.h"#define SQR(X) X*Xint main(int argc, char* argv[]){    int a = 10;    int k = 2;    int m = 1;    a /= SQR(k+m)/SQR(k+m);    printf("%d/n",a);    return 0;}

答:

define 只是定义而已,在编择时只是简单代换X*X而已,并不经过算术法则的
a /= k+m*k+m/k+m*k+m;
=>a /= k + m*k + 0 + m*k + m;
=>a = a/7;
=>a = 1;
--------------------------------------------------------------------------
5. const 符号常量;
(1) const char *p
(2) char const *p
(3) char * const p
说明上面三种描述的区别;

如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。
(1)const char *p
一个指向char类型的const对象指针,p不是常量,我们可以修改p的值,使其指向不同的char,但是不能改变它指向非char对象,如:
const char *p;
char c1='a';
char c2='b';
p=&c1;//ok
p=&c2;//ok
*p=c1;//error
(3)char * const p
此时*p可以修改,而p不能修改。
(4)const char * const p
这种是地址及指向对象都不能修改。
--------------------------------------------------------------------------
6.下面是C语言中两种if语句判断方式。请问哪种写法更好?为什么?

int n;if (n == 10) // 第一种判断方式if (10 == n) // 第二种判断方式

答:第二种方式更好。如果少了个=号,编译时就会报错,减少了出错的可能性,可以检测出是否少了=。
--------------------------------------------------------------------------
7.下面的代码有什么问题?

void DoSomeThing(...){char* p;...p = malloc(1024); // 分配1K的空间if (NULL == p)return;...p = realloc(p, 2048); // 空间不够,重新分配到2Kif (NULL == p)return;...}

答:
p = malloc(1024);     应该写成: p = (char *) malloc(1024);
        没有释放p的空间,造成内存泄漏。

--------------------------------------------------------------------------
8.下面的代码有什么问题?并请给出正确的写法。

void DoSomeThing(char* p){char str[16];int n;assert(NULL != p);sscanf(p, "%s%d", str, n);if (0 == strcmp(str, "something")){...}}

答:
sscanf(p, "%s%d", str, n);   这句该写成: sscanf(p, "%s%d", str, &n);
--------------------------------------------------------------------------
9.下面代码有什么错误?

void test1(){    char string[10];    char *str1="0123456789";    strcpy(string, str1);}

答:数组越界
--------------------------------------------------------------------------
10. 下面代码有什么问题?

void test2(){    char string[10], str1[10];    for(i=0; i<10;i++)    {         str1[i] ='a';    }    strcpy(string, str1);}

答:数组越界

--------------------------------------------------------------------------

11. 下面代码有什么问题?

void test3(char* str1){    char string[10];    if(strlen(str1)<=10)    {        strcpy(string, str1);    }}

答:数组越界。

strlen函数返回的是字符串长度(并不包含'/0'),代码中的判断条件是要确定字符串长度是否超过10。但是这仍然是不够的。因为要存入10个字符的字符串,需要的是大小为11个字符的空间,所以当strlen(str1)为10的时候,string[10]无法存入结束符'/0'。例如像下面这样调用test3()时,就会报错:

char str1[] = "1234567890";test3(str1);

此外,相比于strcpy而言,更建议使用 strncpy 和 memcpy。

--------------------------------------------------------------------------

12. 请说出const与#define 相比,有何优点?
答案:1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
2) 有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。

--------------------------------------------------------------------------

13. int i=10, j=10, k=3; k*=i+j; k最后的值是?
答:60

--------------------------------------------------------------------------

14. 在不用第三方参数的情况下,交换两个参数的值

#include <stdio.h>void main(){        int i=60;        int j=50;        i=i+j;        j=i-j;        i=i-j;        printf("i=%d/n",i);        printf("j=%d/n",j);}

方法二:
i^=j;j^=i;i^=j;

方法三:
// 用加减实现,而且不会溢出a = a+b-(b=a)

--------------------------------------------------------------------------

15. C和C++有什么不同?

答:从机制上来说,C是面向过程的;C++是面向对象的,提供了类。C++侧重于对象而不是过程,侧重于类的设计而不是逻辑的设计。
从适用的方向上来说,C适合要求代码体积小的,效率高的场合,如嵌入式;C++适合更上层的,复杂的; Linux核心大部分是C写的,因为它是系统软件,效率要求极高。
从名称上也可以看出,C++比C多了+,说明C++是C的超集,或者说C++可以向下兼容C的语法。


未完,待续.

VIEWER DISCRETION IS ADVISED!!

原创粉丝点击