C语言笔试题中的“坑”

其实这话说的不对,应该说不只是C语言,恐怕是面试题总会有那么一些坑等着我们踩,今天,就罗列了一些看似简单,却很容易中招的面试题:

1、以下程序的执行结果为          

  #inlcude <stdio.h> 

  #define N 2     

  #define M N+1    

     #define NUM (M+1)*M/2   

  main() 

       {printf("%d",NUM);} 

      A5     B6      C、8       D9

嘿嘿,当初一看到这道题,我心里那个乐的啊,毫不犹豫就选了B,结果,嗯嗯,可想而知,悲剧了,根本就不是这么回事好吗?

其实,这里的#define用了宏定义,#define预处理宏定义命令,它的具体作用,就是方便程序段的定义和修改。简单点说,就是定义之后,以后遇见它后值就不会再发生改变。

例如,上面这道题的N,M,只要在后面遇到M,N直接替换成后面定义的值就好,所以说N=2,M=N+1=2+1,在这里,千万不要画蛇添足把M直接等于3了,是什么样就让它保持什么样,所以NUM=(M+1)*M/2=(2+1+)*2+1/2,最后的结果是8。

2、以下程序的输出结果是          

    #define M(x,y,z) x*y+z

    main()  

    {  int a=1,b=2, c=3;    

     printf("%d\n", M(a+b,b+c, c+a));}                                            A、19   B、17      C、15         D、12 

这道题和上面那道题其实是一种题型,那就废话不多说了,M(a+b,b+c,c+a) = a+b*b+c+c+a = 12,这种题的话,我们只需要注意一点,那就是它是怎么定义的我就怎么使用。

3、已知:char s[4] = "cba"; char *p; 执行语句序列p=s;printf("%c\n",*p+1);后,其输出为          

    A、字符’c’   B、字符’b’    C、字符’a’        D、字符’d’

这个题开始我是有些不理解的,我想的是p=s之后,p和s就指向了同一个地址,而printf("%c\n",*p+1);表示的是输出*p+1对应的字符,那么*p,也就是数组s的首地址,即s[0],就是字符'c'。而我想当然的认为它加1后就应该指向s[1],当然这个想法是不正确的。其实,到这里和s这个数组已经没太大关系了,*p+1相当于'c'+1,它表示的是字符c的下一个ASCII码字符,也就是小写字母d,所以,最后的答案是d。

4、执行下列程序段后,变量a,b,c的值分别是      

     int x=10,y=9;

     int a,b,c;

     a=(--x==y++)?--x:++y;

     b=x++;

     c=y;

    A、a=9,b=9,c=9   B、a=9,b=10,c=9  C、a=1,b=11,c=10  D、a=8,b=8,c=10

(1)首先是三目运算符的判断,--x是先自减,再运算,所以,此时x=10-1=9,y++是先运算,再自增,y和现在的x都是等于9,满足(--x==y++)条件,所以a = --x,即a = 9-1 =8;

(2)其次,b = x++;上一步已经算出x的值为8,这里是先运算再自增,所以b=8;

(3)最后,c = y,y再第一步自增后已经变为10,所以c = 10,最后的答案是D。

展开阅读全文

没有更多推荐了,返回首页