作为菜鸟的我,最近在做笔试准备,遇到一些C语言题,懵懵懂懂的,感觉有必要总结和分享一下。
1.关于宏定义
设有以下宏定义:
#define N 3
#define MULTI(n) N*n+n
则执行语句:sum = N* MULTI(N+1)后,sum 的值是___.
首先结果是这样子的:sum=N*N*N+1+N+1=32;
如果想要得到一下差不多的答案,比如:40,可以改一下#define MULTI(n) N*n+n,改为#define MULTI(n) N*(n)+(n);
42,可以改一下sum = N* MULTI(N+1),改为sum = N*( MULTI(N+1));
48,可以改一下#define MULTI(n) N*n+n=>#define MULTI(n) N*(n)+(n),
sum = N* MULTI(N+1)=>sum = N*( MULTI(N+1))。
解释一下原因:
(1)所谓宏定义只作替换,不做计算,不做表达式求解;
(2)宏展开不占运行时间,函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存
这样子就可以清楚的明白为什么会出现上述差不多的答案了。
2.i++和++i:
关于这个我就不班门弄斧了,记住一点:i++和++i,单独运算最后结果i都加了1;但是碰到i++和++i与其他表达式运算,区别就出来了:++i 是i+1之后在运算,i++是与其他表达式运算过后,i再加1。最经典的就是下面这一道题。
main()
{
int x=20,y=35;
x=y++ + x++;
y= ++y + ++x;
printf(“%d%d\n”,x,y);
}
Answer : 57 943.关于运算符:
void main(void )
{
int a=1;b=2;c=3;
if( ++a==1&&( b++=2||c++=3 ) );
printf("%d %d %d\n",a,b,c);
}
最后执行结果是___.
结果是:2 2 3
解释原因:首先弄清楚++a是怎么回事,其次就是&&和||运算的特点。对于++a,可以参考上面的2;而&&和||运算的特点:短路运算符,如果左边为假,&&就不计算右边的了;如果左边为真,||就不计算右边了。