代码疑云(2)-c函数调用约定
2011-07-06 00:24
267 查看
代码:
疑:两次调用foo函数分别输出了什么,为什么?
解答:按照cedel函数调用的约定,编译器使参数从左到右的入栈。第一次调用为什么p1,p2,p3的值全是3呢,原因在此,在foo被call之前三++i 操作将先被操作也就是连续自增了3次,最终结果i 的值是3,然后是编译器push(i),push(i),push(i)三次入栈,然后call到foo定义处依次出栈并相应地复制给了形参。第二次调用foo时,一开始与第一次一样先是计算三次++操作,但是所不同的是最后两个是i++,i++
刚没说到它们的计算顺序,编译器计算这些的顺序是由右到左的,也就是先i++,再i++,最后是++i,而运算i++是先取值再自增的,编译器会先把i (这时为0)存入寄存器(cpu中的存储器),再加1,然后计算下一个i++ 与前一次一样,所不同的是这次 i 的值是1,因为前面已加1 ,最后++i 。
!!代码疑云系列由本人在天天唯C论坛下首发
=======
welcome to my HomePage(http://blog.csdn.net/zhanxinhang) to
have a communication =======
#include<iostream> using namespace std; void foo(int p1,int p2,int p3) { cout<<"p1="<<p1<<endl <<"p2="<<p2<<endl <<"p3="<<p3<<endl; } int main() { int i; cout<<"first call:"<<endl; i=0; foo(++i,++i,++i); cout<<"second call:"<<endl; i=0; foo(++i,i++,i++); return 0; }
疑:两次调用foo函数分别输出了什么,为什么?
解答:按照cedel函数调用的约定,编译器使参数从左到右的入栈。第一次调用为什么p1,p2,p3的值全是3呢,原因在此,在foo被call之前三++i 操作将先被操作也就是连续自增了3次,最终结果i 的值是3,然后是编译器push(i),push(i),push(i)三次入栈,然后call到foo定义处依次出栈并相应地复制给了形参。第二次调用foo时,一开始与第一次一样先是计算三次++操作,但是所不同的是最后两个是i++,i++
刚没说到它们的计算顺序,编译器计算这些的顺序是由右到左的,也就是先i++,再i++,最后是++i,而运算i++是先取值再自增的,编译器会先把i (这时为0)存入寄存器(cpu中的存储器),再加1,然后计算下一个i++ 与前一次一样,所不同的是这次 i 的值是1,因为前面已加1 ,最后++i 。
!!代码疑云系列由本人在天天唯C论坛下首发
=======
welcome to my HomePage(http://blog.csdn.net/zhanxinhang) to
have a communication =======
相关文章推荐
- 代码疑云(2)-c函数调用约定
- 代码疑云(2)-c函数调用约定
- Android NDK(JNI)学习总结一:Java代码中申明native函数-Java调用C函数,并在C函数中访问java类和方法、属性
- c函数调用约定
- cdecl和stdcall调用约定的汇编代码对比
- 嵌入式系统上C++调用C语言接口代码链接时找不到C函数问题处理
- cdecl和stdcall调用约定的汇编代码对比
- ADS1.2 在汇编代码中调用C函数
- 代码疑云(5)-类成员函数的thiscall约定
- 反汇编时的函数识别及各函数调用约定的汇编代码分析
- 代码疑云(5)-类成员函数的thiscall约定
- cdecl和stdcall调用约定的汇编代码对比
- Windows平台X64函数调用约定与汇编代码分析
- cdecl和stdcall调用约定的汇编代码对比
- 在汇编代码中调用C函数
- 代码疑云(5)-类成员函数的thiscall约定
- 反汇编时的函数识别及各函数调用约定的汇编代码分析
- C函数调用与栈--代码真相
- Windows平台X64函数调用约定与汇编代码分析
- 在汇编代码中调用C函数