C语言面试那点小事——C语言细节(1)

作为菜鸟的我,最近在做笔试准备,遇到一些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 94

3.关于运算符:

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;而&&和||运算的特点:短路运算符,如果左边为假,&&就不计算右边的了;如果左边为真,||就不计算右边了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值