C经典笔试题之2

来源:互联网 发布:2017春晚 知乎 编辑:程序博客网 时间:2024/05/16 10:20

 

 

C经典笔试题之2

 

        1、局部变量能否和全局变量重名?

答:局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内



2、如何引用一个已经定义过的全局变量?

答:可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。(不要问我什么是编译期间,什么是连接期间,请自己查资料)





3、全局变量定义在可被多个.C文件包含的头文件中可不可以?为什么?

答:可以,但要加static



4、语句for( ;1 ;)有什么问题?它是什么意思?

答:死循环,同while(1),这种写法并不规范,可读性差,一般不用



5、do……while和while……do有什么区别?

答:前一个循环一遍再判断,后一个判断以后再循环



6、请写出下列代码的输出内容

#include

main()

{

int a,b,c,d;

a=10;

b=a++;

c=++a;

d=10*a++;

printf("b,c,d:%d,%d,%d",b,c,d);

return 0;

}

答:10,12,120



7.static函数与普通函数有什么区别?

只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件。



8.static全局变量与普通的全局变量有什么区别?

全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。

这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。



9.程序的局部变量存在于(栈)中,全局变量存在于(静态区)中,动态申请数据存在于(堆)中。



10.设有以下说明和定义:

typedef union {long i; int k[5]; char c;} DATE;

struct data { int cat; DATE cow; double dog;} too;

DATE max;

则语句 printf("%d",sizeof(struct date)+sizeof(max));的执行结果是:___52____



11.队列和栈有什么区别?

队列先进先出,栈后进先出



12.写出下列代码的输出内容

#include

int inc(int a)

{

return(++a);

}

int multi(int*a,int*b,int*c)

{

return(*c=*a**b);

}

typedef int(FUNC1)(int in);

typedef int(FUNC2) (int*,int*,int*);



void show(FUNC2 fun,int arg1, int*arg2)

{

INCp=&inc;

int temp =p(arg1);

fun(&temp,&arg1, arg2);

printf("%d\n",*arg2);

}



main()

{

int a;

show(multi,10,&a);

return 0;

}



翻译一下

==================================

#include

using namespace std;



// 返回a + 1

int inc(int a){

return a+1;

}

// out = a*b

int multi(int& a, int& b, int& out){

return out = a*b;

}



// 定义两种函数,FUNC1对应inc, FUNC2对应 multi

typedef int(FUNC1) (int in);

typedef int(FUNC2) (int&,int&,int&);



// 诡异的函数,这是模糊C大赛么...

void show( FUNC2* func, int num, int& out ){

FUNC1* pInc = inc;//原文这句写错了...orz... INC根本没定义

int numAdd1 = pInc( num );

// 等价于 numAdd1 = inc( num );

// 结果 num仍然是10, numAdd1 = 11



// 调用func函数,可以看到, main中传给func的是 multi.

// 所以调用的是 multi( 11, 10, out ), out = 110

func( numAdd1, num, out );

cout<}



int main(){

int a;

show(multi,10, a);

return 0;

}

==================================



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

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

==================================

main(){

char*src="hello,world";

char* dest=NULL;



int len=strlen(src);

dest=(char*)malloc(len);//!1 少分配了一字节. strlen计数不包括\0



char* d = dest;

char* s = src[len];//!2 两个错误. 应该为 &src[ len-1 ]

while( len-- != 0 )

d++=s--;//!3 *d++ = *s--;

//!4 尾部要\0,应加上 *d = 0;



printf("%s",dest);

return 0;

}

==================================



修正后的答案:

==================================

int main(){

char* src = "hello,world";



int len = strlen(src);

char* dest = (char*)malloc(len+1);.



char* d = dest;

char* s = &src[len-1];

while( len-- != 0 )

*d++=*s--;

*d = 0;



printf("%s",dest);

return 0;

}