非常基本关于C语言的问题,一个信息类(计算机,资讯工程,电子工程,通信工程)专业的本科毕业生应该达到的水平。题目不难,全部都能快速地答完,当然也需要一定的知识储备。对于大多数人,我们预期你可能答错3)4)15)题,所以答错3道以内的,我们认为你很棒答错5道题以内,我们认为你还不错(你还可能答错第9题)如果你有6道以上的题目不能答对,基本上我们都不好说什么了....约定:1)下面的测试题中,认为所有必须的头文件都已经正确的包含了2)数据类型char一个字节1byteint两个字节2byte(16位系统,认为整型是2个字节)longint四个字节4bytefloat四个字节4byetdouble八个字节8bytelongdouble十个字节10bytepointer两个字节2byte(注意,16位系统,地址总线只有16位)第1题:考查对volatile关键字的认识#includesetjmp.hstaticjmp_bufbuf;main(){volatileintb;b=3;if(setjmp(buf)!=0){printf(%d,b);exit(0);}b=5;longjmp(buf,1);}请问,这段程序的输出是(a)3(b)5(c)0(d)以上均不是第2题:考查类型转换main(){structnode{inta;intb;intc;};structnodes={3,5,6};structnode*pt=&s;printf(%d,*(int*)pt);}这段程序的输出是:(a)3(b)5(c)6(d)7第3题:考查递归调用intfoo(intx,intn){intval;val=1;if(n0){if(n%2==1)val=val*x;val=val*foo(x*x,n/2);}returnval;}这段代码对x和n完成什么样的功能(操作)?(a)x^n(x的n次幂)(b)x*n(x与n的乘积)(c)n^x(n的x次幂)(d)以上均不是第4题:考查指针,这道题只适合于那些特别细心且对指针和数组有深入理解的人main(){inta[5]={1,2,3,4,5};int*ptr=(int*)(&a+1);printf(%d%d,*(a+1),*(ptr-1));}这段程序的输出是:(a)22(b)21(c)25(d)以上均不是第5题:考查多维数组与指针voidfoo(int[][3]);main(){inta[3][3]={{1,2,3},{4,5,6},{7,8,9}};foo(a);printf(%d,a[2][1]);}voidfoo(intb[][3]){++b;b[1][1]=9;}这段程序的输出是:(a)8(b)9(c)7(d)以上均不对第6题目:考查逗号表达式main(){inta,b,c,d;a=3;b=5;c=a,b;d=(a,b);printf(c=%d,c);printf(d=%d,d);}这段程序的输出是:(a)c=3d=3(b)c=5d=3(c)c=3d=5(d)c=5d=5第7题:考查指针数组main(){inta[][3]={1,2,3,4,5,6};int(*ptr)[3]=a;printf(%d%d,(*ptr)[1],(*ptr)[2]);++ptr;printf(%d%d,(*ptr)[1],(*ptr)[2]);}这段程序的输出是:(a)2356(b)2345(c)4500(d)以上均不对第8题:考查函数指针int*f1(void){intx=10;return(&x);}int*f2(void){int*ptr;*ptr=10;returnptr;}int*f3(void){int*ptr;ptr=(int*)malloc(sizeof(int));returnptr;}上面这3个函数哪一个最可能引起指针方面的问题(a)只有f3(b)只有f1andf3(c)只有f1andf2(d)f1,f2,f3第9题:考查自加操作(++)main(){inti=3;intj;j=sizeof(++i+++i);printf(i=%dj=%d,i,j);}这段程序的输出是:(a)i=4j=2(b)i=3j=2(c)i=3j=4(d)i=3j=6第10题:考查形式参数,实际参数,指针和数组voidf1(int*,int);voidf2(int*,int);void(*p[2])(int*,int);main(){inta;intb;p[0]=f1;p[1]=f2;a=3;b=5;p[0](&a,b);printf(%d\t%d\t,a,b);p[1](&a,b);printf(%d\t%d\t,a,b);}voidf1(int*p,intq){inttmp;tmp=*p;*p=q;q=tmp;}voidf2(int*p,intq){inttmp;tmp=*p;*p=q;q=tmp;}这段程序的输出是:(a)5555(b)3535(c)5353(d)3333第11题:考查自减操作(--)voide(int);main(){inta;a=3;e(a);}voide(intn){if(n0){e(--n);printf(%d,n);e(--n);}}这段程序的输出是:(a)0120(b)0121(c)1201(d)0211第12题:考查typedef类型定义,函数指针typedefint(*test)(float*,float*)testtmp;tmp的类型是(a)函数的指针,该函数以两个指向浮点数(float)的指针(pointer)作为参数(arguments)Pointertofunctionofhavingtwoargumentsthatispointertofloat(b)整型(c)函数的指针,该函数以两个指向浮点数(float)的指针(pointer)作为参数(arguments),并且函数的返回值类型是整型Pointertofunctionhavingtwoargumentthatispointertofloatandreturnint(d)以上都不是第13题:数组与指针的区别与联系main(){charp;charbuf[10]={1,2,3,4,5,6,9,8};p=(buf+1)[5];printf(%d,p);}这段程序的输出是:(a)5(b)6(c)9(d)以上都不对第14题:考查指针数组的指针Voidf(char**);main(){char*argv[]={ab,cd,ef,gh,ij,kl};f(argv);}voidf(char**p){char*t;t=(p+=sizeof(int))[-1];printf(%s,t);}这段程序的输出是:(a)ab(b)cd(c)ef(d)gh第15题:此题考查的是C的变长参数,就像标准函数库里printf()那样,这个话题一般国内大学课堂是不会讲到的,不会也情有可原呵呵,#includestdarg.hintripple(int,...);main(){intnum;num=ripple(3,5,7);printf(%d,num);}intripple(intn,...){inti,j;intk;va_listp;k=0;j=1;va_start(p,n);for(;jn;++j){i=va_arg(p,int);for(;i;i&=i-1)++k;}returnk;}这段程序的输出是:(a)7(b)6(c)5(d)3第16题:考查静态变量的知识intcounter(inti){staticintcount=0;count=count+i;return(count);}main(){inti,j;for(i=0;i=5;i++)j=counter(i);}本程序执行到最后,j的值是:(a)10(b)15(c)6(d)7详细参考答案第1题:(b)volatile字面意思是易于挥发的。这个关键字来描述一个变量时,意味着给该变量赋值(写入)之后,马上再读取,写入的值与读取的值可能不一样,所以说它容易挥发的。这是因为这个变量可能一个寄存器,直接与外部设备相连,你写入之后,该寄存器也有可能被外部设备的写操作所改变;或者,该变量被一个中断程序,或另一个进程改变了.volatile不会被编译器优化影响,在longjump后,它的值是后面假定的变量值,b最后的值是5,所以5被打印出来.setjmp:设置非局部跳转/*setjmp.h*/Storescontextinformationsuchasregistervaluessothatthelomgjmpfunctioncanreturncontroltothestatementfollowingtheonecallingsetjmp.Returns0whenitisinitiallycalled.Lonjjmp:执行一个非局部跳转/*setjmp.h*/Transferscontroltothestatementwherethecalltosetjmp(whichinitializedbuf)wasmade.Executioncontinuesatthispointasiflongjmpcannotreturnthevalue0.Anonvolatileautomaticvariablemightbechangedbyacalltolongjmp.Whenyouusesetjmpandlongjmp,theonlyautomaticvariablesguaranteedtoremainvalidarethosedeclaredvolatile.Note:Testprogramwithoutvolatilequalifier(resultmayvery)更详细介绍,请参阅C语言的setjmp和longjmp第2题:(a)结构题的成员在内存中的地址是按照他们定义的位置顺序依次增长的。如果一个结构体的指针被看成它的第一个成员的指针,那么该指针的确指向第一个成员第3题:(a)此题目较难.这个程序的非递归版本intwhat(intx,intn){intval;intproduct;product=1;val=x;while(n0){if(n%2==1)product=product*val;/*如果是奇数次幂,x(val)要先乘上一次,;偶数次幂,最后返回时才会到这里乘以1*/val=val*val;n=n/2;}returnproduct;}/*用二元复乘策略*/算法描述(whilen0){ifnextmostsignificantbinarydigitofn(power)isonethenmultiplyaccumulatedproductbycurrentval,reducen(power)sequencebyafactoroftwousingintegerdivision.getnextvalbymultiplycurrentvalueofitself}第4题:(c)a的类型是一个整型数组,它有5个成员&a的类型是一个整型数组的指针所以&a+1指向的地方等同于a[6]所以*(a+1)等同于a[1]ptr等同a[6],ptr-1就等同与a[5]第5题:(b)题目自身就给了足够的提示b[0][0]=4b[1][0]=7第6题:(c)考查逗号表达式,逗号表达式的优先级是很低的,比赋值(=)的优先级低.逗号表达式的值就是最后一个元素的值逗号表达式的还有一个作用就是分割函数的参数列表..E1,E2,...,En上面这个表示式的左右是,E1,E2,...En的值被分别计算出来,En计算出来的结构赋给整个逗号表达式c=a,b;/*yieldsc=a*/d=(a,b);/*d=b*/第7题:(a)ptr是一个数组的指针,该数组有3个int成员第8题:(c)f1显然有问题,它返回一个局部变量的指针,局部变量是保存在stack中的,退出函数后,局部变量就销毁了,保留其指针没有意义,因为其指