1楼:匿名用户
栈是先入后出的数据结构.
函数参数从右到左, 那么到函数内部出栈的时候就是从左到右的顺序了.
对于普通函数无区别. 但对于可变参函数, 会根据左侧参数来决定共计有多少参数, 每个类型是什么.
比如 printf scanf这类的.
于是 就设计成从右到左的压栈方式了.
2楼:苟周暴向雁
c语言函数参数入栈顺序从右到左是为了方便可变参数函数。
一、在函数调用时,函数参数的传递,在c语言中是通过栈数据结构实现的。
在调用函数时,先根据调用函数使用的参数,自右向左依次压入栈中,然后调用函数,在函数开始执行时
c语言函数参数压栈顺序与求值顺序的问题
3楼:匿名用户
压栈顺序是从右到左,而求值顺序则是undefined的,由编译器实现决定。
请参考:
http://bbs.chinaunix.***/thread-730010-1-1.html
4楼:匿名用户
我的回答
在cmd下输入
doskey xiaohei=dir
doskey dir=echo bad ***mand or file name
现在dir命令将无法使用,由我设置的xiaohei代替了。
输入dir显示bad ***mand or file name,而输入我自己设置的xiaohei,就是以前dir一样的功能。
知道这个用法,我们还可以使fdisk、format、deltree等危险的命令失效。
x86上为什么c语言调用一个函数要先把参数压栈,之后才是返回地址
5楼:顽劣之徒
返回地址先于参数入
栈是不可能的== 因为参数入栈是调用函数通过push指令完成的 而返回地址入栈则是在call指令中自动完成的 因此如果一定要先把返回地址压栈 就需要先调用call指令 call指令返回之后 程序就已经在被调函数里面了 调用函数已经失去了控制权 不可能再通过push指令把参数压栈了……
此外额我觉得这涉及到x86的一个规范吧…… 函数调用时参数压栈和被调函数返回后参数出栈都是由调用函数来完成 被调函数不参与(否则如果两者同时参与很容易把栈搞混乱) 如果参数在返回地址上方 被调函数返回的时候 为了取得返回地址 被调函数必须先把参数出栈 这就与之前说的规范冲突了
6楼:日名字全被注册
这个没有为什么。除了硬性的逻辑需求,就是约定。
逻辑需求就是你必须在call指令之前完成参数传递,也就是你所说的压栈,这是__cdecl调用约定。其实还有fastcall调用约定,这个在86_32环境下两个及以下参数是不需要入栈的,因为它使用ecx和edx寄存器传递。入栈顺序方面,就是约定了,这个并不是刚需,但为了保证可移植性,由人来定义的一种方法形式。
关于你说的返回地址,这个并不是主动的push rip+n什么的(而且不支持这个指令)。而是call指令的效果。
在c语言里,参数的压栈和出栈分别是什么意思
7楼:匿名用户
压栈是进栈,把元素放到栈里面;出栈,把元素从栈中取出。
栈是先进后出。举个例子,一个装羽毛球的筒子,一边能开一边不能开,1号球先进去,到筒子底部(进栈)。然后2号球接着进去,在你不拿出2号球的情况下,你是无法拿走1号球。
而拿走球的操作就是出栈咯
8楼:匿名用户
压栈:就是进栈的意思,也就是把元素放到栈中去。出栈:当然就是取出栈中元素的意思,
9楼:匿名用户
数据结构,算法,栈的意思。栈算法的特点是先进后出
在c语言里,参数的压栈和出栈分别是什么意思
1楼 匿名用户 压栈是进栈,把元素放到栈里面 出栈,把元素从栈中取出。 栈是先进后出。举个例子,一个装羽毛球的筒子,一边能开一边不能开,1号球先进去,到筒子底部 进栈 。然后2号球接着进去,在你不拿出2号球的情况下,你是无法拿走1号球。 而拿走球的操作就是出栈咯 2楼 匿名用户 压栈 就是进栈的意思...
c语言中的函数形参为void是什么意思
1楼 匿名用户 c语言中的void 基本上就是两个意思 无,没有 任意类型 这两个意思,与void出现的 位置和修饰变量相关 函数返回值位置,如 void func int i 表示func 函数没有返回值,void不可省 函数参数位置,如 void func void 表示func 函数即没有返回...
c语言函数传参数加在前是什么意思
1楼 幻形术 c语言不能在函数参数前加 ,能加 的是c 语言。 在c 语言里,类型后加 表示引用,如 int a int b a 表示b引用a,b实际上就是a的别名。修改b的值也会导致a的值被修改。 函数传参时,加 表示把实参直接传递给函数,而不加 表示是传拷贝。 传引用 将实参直接传给形参,对于复...