其实这话说的不对,应该说不只是C语言,恐怕是面试题总会有那么一些坑等着我们踩,今天,就罗列了一些看似简单,却很容易中招的面试题:
1、以下程序的执行结果为。
#inlcude
#define N 2
#define M N+1
#define NUM (M+1)*M/2
main()
{printf("%d",NUM);}
A、5 B、6 C、8 D、9
嘿嘿,当初一看到这道题,我心里那个乐的啊,毫不犹豫就选了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、以下程序的输出结果是。
#defineM(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、15D、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的值分别是。
intx=10,y=9;
inta,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=10D、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。