C语言面试笔试题 ( 三 )

1.

宏与内联函数的区别

内联函数和宏都是在程序出现的地方展开,内联函数不是通过函数调用实现的,是在调用该函数的程序处将它展开(在编译期间完成的);宏同样是(但在预处理阶段)

不同的是:内联函数可以在编译期间完成诸如类型检测,语句是否正确等编译功能;宏就不具有这样的功能,而且宏展开的时间和内联函数也是不同的(在运行期间展开)


2.

含参数的宏与函数的优缺点

宏:

优点:在预处理阶段完成,不占用编译时间,同时,省去了函数调用的开销,运行效率高

缺点:不进行类型检查,多次宏替换会导致代码体积变大,而且由于宏本质上是字符串替换,故可能会由于一些参数的副作用导致得出错误的结果。

 

函数:

优点:没有带参数宏可能导致的副作用,进行类型检查,计算的正确性更有保证。

缺点:函数调用需要参数、返回地址等的入栈、出栈开销,效率没有带参数宏高


3.

如何定义和实现一个类的成员函数为回调函数

要定义和实现一个类的成员函数为回调函数需要做三件事:

a.声明;

b.定义;

c.设置触发条件,就是在你的函数中把你的回调函数名作为一个参数,以便系统调用 

一、声明回调函数类型

typedef void (*FunPtr)(void);

二、定义回调函数

class A  

{

public:

A();

static void callBackFun(void) //回调函数,必须声明为static

{

  cout<<"callBackFun"<

}

virtual ~A();

};

三、设置触发条件

void Funtype(FunPtr p)

{

p();

}

void main(void)

{

Funtype(A::callBackFun);

}

 

4.

请写出下列代码的输出内容

#include

main()

{

int a,b,c,d;

a=10;

b=a++;

c=++a;

d=10*a++;

printf("bcd%d%d%d"bcd;

return 0;

}

答:1012120 


5.

请找出下面代码中的所以错误

说明:以下代码是把一个字符串倒序,如abcd”倒序后变为“dcba

#include "string.h"

main()

{

char*src="hello,world";

char* dest=NULL;

int len=strlen(src); 

dest=(char*)malloc(len);

char* d=dest;

char* s=src[len];

while(len--!=0)

     d++=s--;

printf("%s",dest);

return 0;

}

答:

方法1

int main()

{

char* src = "hello,world";

int len = strlen(src);

char* dest = (char*)malloc(len+1);  //要为\0分配一个空间

char* d = dest;

char* s = &src[len-1];  //指向最后一个字符

while( len-- != 0 )

    *d++=*s--;

*d = 0;//尾部要加\0

printf("%s\n",dest);

free(dest);   // 使用完,应当释放空间,以免造成内存汇泄露

return 0;

}

 

方法2

#include

#include

main()

{

char str[]="hello,world";

int len=strlen(str);

char t;

for(int i=0; i

{

t=str[i];

str[i]=str[len-i-1]; str[len-i-1]=t;

}

printf("%s",str);

return 0;


6.

-1,2,7,28,,126请问28126中间那个数是什么?为什么? 

答案应该是4^3-1=63

规律是n^3-1(n为偶数024)

n^3+1(n为奇数135)

答案:63 


7.

用两个栈实现一个队列的功能?要求给出算法和思路!

2个栈为A,B, 一开始均为空.

入队:

将新元素push入栈A;

 出队:

(1)判断栈B是否为空;

(2)如果不为空,则将栈A中所有元素依次pop出并push到栈B

(3)将栈B的栈顶元素pop出;这样实现的队列入队和出队的平摊复杂度都还是O(1), 


8.

c语言库函数中将一个字符转换成整型的函数是atool()吗,这个函数的原型是什么? 

函数名: atol

: 把字符串转换成长整型数

: long atol(const char *nptr);

 

程序例:

#include

#include

int main(void)

{

long l;

char *str = "98765432";

l = atol(lstr);

printf("string = %s integer = %ld\n", str, l);

return(0);



你可能感兴趣的:(C)