栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

函数传参之入栈出栈问题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

函数传参之入栈出栈问题

代码段:

问题1: 参数入栈顺序

问题2: add函数结束时,x,y变量被释放了吗

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include 
#include 
#include 
int add(int x, int y)
{
	return x + y;
}
int main()
{
	int a = 10, b = 20;
	int c = add(a,b);
	system("pause");
	return 0;
}

1、在主调函数和被调函数之间,要遵循一致的约定,才能保证正确传参被使用,这一约定称之为调用惯例

2、调用惯例

首先明确c程序,栈底为高地址,栈顶为低地址.

在c/c++程序中,默认的调用惯例为_cdecl,即上述被调函数add()的完整表达为:

                                int  _cdecl add (int x, int y)

参数传递为从右往左,而出栈顺序刚好相反,正好取参数相匹配.而由主调函数决定栈变量的释放.

关于函数名字修饰无须了解.

举个例子:   

#include 
int main()
{           	
	int a = 2;
	printf("%d %d %d %dn",a++,++a,a++,a);	
	return 0;
}

输出结果应该是  4 5  2  5

 解释如下:

参数入栈为从右往左 :

 经过三次自加运算,a的值为5,所有++a的值和a的值都被更新为5,a++的值保持不变

关于为什么++a和a的值会被更新而a++的值不会更新,这是别人的解释:

对于a++的结果,是有ebp寻址函数栈空间来记录中间结果的,在最后给printf压栈的时候,再从栈中把中间结果取出来;而对于++a的结果,则直接压寄存器变量,寄存器经过了所有的自增操作.

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/768151.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号