这道题是在飞思卡尔公司时,遇到的。看似很简单,但是很容易错。直接看题吧。
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.我想这就和编译器了关了。
他在传递参数前,先把参数计算好,再一次性把所有参数入栈,这里我的理解就不一定正确了。 这样设计肯定有一定的理由,大家可以分析分析。