嵌入式C面试题

这道题是在飞思卡尔公司时,遇到的。看似很简单,但是很容易错。直接看题吧。

int sub(int a,int b)

{

return a-b;

}

int main(int argc,char **argv)

{

int i=2;

int y=sub(++i,++i);

printf("%d",y);

return 0;

}

请写出输出结果:

看到这道题,很多同学,就会纠结了,都在思考,这个sub函数调用,到底是先传哪一个参数。从右往左呢?还是从左往右呢。所以心里就在纠结这个答案是1还是-1.

我以前在做实验的时候,调程序的时候遇到过一次这个问题,所以印象深刻,这个调用返回值其实不是1和-1.而真正的值是0.

很费解了吧,看汇编代码就一目了解了。

从汇编代码可以看出,是变量i连续做两次自增,然后再传,也就是push edx,push eax.  将参数入栈。  所以这里两个参数的值都是4.  计算结果为0.我想这就和编译器了关了。

他在传递参数前,先把参数计算好,再一次性把所有参数入栈,这里我的理解就不一定正确了。  这样设计肯定有一定的理由,大家可以分析分析。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值