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。

猜你喜欢

转载自blog.csdn.net/weixin_38629529/article/details/82185675