关闭

C/C++笔试面试题目

611人阅读 评论(0) 收藏 举报
分类:

1、main函数执行完毕后,是否可能会再执行一段代码?

       答案:可以,可用_onexit 注册一个函数,它会在main()函数之后执行。

2、一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态?  在子类的空间里,有没有父类的这个函数,或者父类的私有变量? (华为笔试题)  

       答案:只要基类在定义成员函数时已经声明了virtue关键字,在派生类实现的时候覆盖该函数时,virtue关键字可加可不加,不影响多态的实现。子类的空间里有父类的所有变量(static除外)。 

3、算法复杂度
       答案:算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。(算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度)。

4、堆栈溢出一般是由什么原因导致的?       

       答案:没有回收垃圾资源。

5、全局变量和局部变量在内存中是否有区别?如果有,是什么区别?

       答案:全局变量储存在静态数据库,局部变量在堆栈。

6、冒泡排序算法的时间复杂度是什么?

       答案:时间复杂度是O(n^2)。

7、 Internet采用哪种网络协议?该协议的主要层次结构?

       答案:Tcp/Ip协议,主要层次结构为: 应用层/传输层/网络层/数据链路层/物理层。

8、不能做switch()的参数类型是?

      答案: switch的参数不能为实型。

9、“引用”与指针的区别是什么?
       答案:1) 引用必须被初始化,指针不必。
                  2) 引用初始化以后不能被改变,指针可以改变所指的对象。
                  3) 不存在指向空值的引用,但是存在指向空值的指针。
       指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。

       流操作符<<和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用

10、.h头文件中的ifndef/define/endif 的作用?
       答:防止该头文件被重复引用。

11、#include<file.h> 与 #include "file.h"的区别?
       答前者是从Standard Library的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用file.h。

12、进程和线程的差别。

       答案:线程是指进程内的一个执行单元,也是进程内的可调度实体,与进程的区别:
    (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
    (2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
    (3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
    (4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

13、什么是预编译,何时需要预编译:

       答案:就是指程序执行前的一些预处理工作,主要指#表示的.何时需要预编译?

    (1)总是使用不经常改动的大型代码体。
    (2)程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。

14、写一个“标准”宏,这个宏输入两个参数并返回较小的一个。

       答:#define Min(X, Y) ((X)>(Y)?(Y):(X)) //结尾没有;

15、嵌入式系统中经常要用到无限循环,你怎么用C编写死循环。

       答案:while(1){}或者for(;;)   //前面那个较好

16、关键字static的作用是什么?

       答案:(1)定义静态局部变量,作用域从函数开始到结束.
                  (2)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
                  (3)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝

17、关键字const有什么含意?

   (1)表示常量不可以修改的变量。

   (2)可以修饰参数,作为输入参数.

   (3)修饰函数,防止以外的改动.

   (4)修饰类的成员函数,不改变类中的数据成员.

18、关键字volatile有什么含意?并举出三个不同的例子?

       提示编译器对象的值可能在编译器未监测到的情况下改变。例子:  硬件时钟; 多线程中被多个任务共享的变量等。

19、int (*s[10])(int) 表示的是什么?

       int (*s[10])(int) 函数指针数组,每个指针指向一个int func(int param)的函数。

20、指针识别
int *p[n];-----指针数组,每个元素均为指向整型数据的指针。
int (*p)[n];------p为指向一维数组的指针,这个一维数组有n个整型数据。
int *p();----------函数带回指针,指针指向返回的值。
int (*p)();------p为指向函数的指针。

21、编写用C语言实现的求n阶阶乘问题的递归算法:

long int fact(int n)
{
If(n==0||n==1)
    Return 1;
Else
    Return n*fact(n-1);
}

22、求下列函数的返回值

int func(x) 

    int countx =0; 
    while(x) 
    { 
          countx ++; 
          x = x&(x-1); 
     } 
    return countx; 
}
答案:8

23、什么是“引用”?申明和使用“引用”要注意哪些问题?

       引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同。申明一个引用的时候,切记要对其进行初始化。引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。不能建立数组的引用。
24、在C++程序中调用被C 编译器编译后的函数,为什么要加extern “C”?

       首先,作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。

通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数
extern "C"是连接申明(linkage declaration),被extern "C"修饰的变量和函数是按照C语言方式编译和连接的,来看看C++中对类似。

25、分别写出BOOL, int, float, 指针类型的变量a 与“零”的比较语句。

BOOL :  if ( !a ) or if(a)
int :   if ( a ==0)
float : const EXPRESSION EXP =0.000001
  if ( a < EXP&& a >-EXP)
pointer : if ( a != NULL) or if(a == NULL)

26、请说出const与#define 相比,有何优点?

(1)const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。

(2) 有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。

27、C语言退出函数或整个程序的语句是什么?

       return可以退出当前函数,如果用在main函数中,则可以直接退出程序。
       exit()(参数为int型)可以直接退出程序,常用于需要在非main函数中需要退出程序的情况。

28、使用指针的好处

    (1)可以动态分配内存
    (2)进行多个相似变量的一般访问
    (3)为动态数据结构,尤其是树和链表,提供支持
    (4)遍历数组,如解析字符串
    (5)高效地按引用“复制”数组与结构,特别是作为函数参数的时候,可以按照引用传递函数参数,提高开发效率

29、构造函数没有返回值,如何得知对象是否构造成功?

       答:这里的构造不是单指分配对象本身的内存,而是指建立对象是做的初始化操作(如打开文件、连接数据库等)。因为没有返回值,所以通知对象的构造失败的唯一方法是在构造函数中抛出异常,这将导致对象的析构函数不被执行,当对象发生部分析构时,已经构造完毕的子对象将会逆序地被析构。

30、printf()函数是否具有返回值?

#include<iostream>
using namespace std;
int main()
{
	int i=4321;
	printf("%d\n",printf("%d",printf("%d",i)));
	printf("%d\n",printf("%d\n",printf("%d\n",i)));
	return 0;
}
以上程序第一行输出:432141

第二行输出:

4321

5

2

原因是,第一个函数由于i的值包含四个字符数,而‘\n’占据一个字符,所以一共是5个字符,第三行中,5与‘\n’占两个字符,所以输出2。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:780814次
    • 积分:9890
    • 等级:
    • 排名:第1996名
    • 原创:267篇
    • 转载:34篇
    • 译文:1篇
    • 评论:112条
    博客专栏
    Python

    文章:0篇

    阅读:0
    最新评论