C语言函数参数压栈顺序与求值顺序的问题
压栈顺序是从右到左,而求值顺序则是undefined的,由编译器实现决定。
请参考:
c语言函数参数入栈顺序
从右向左;
例如:f(int a, int b, int c)
c先入栈,然后b,其次a;
C语言中函数参数压栈方式为什么是从右到左的
因为有些是不定参数的
这样函数内 在处理的时候 从左到右 会更方便。
根据前面的参数 来确定后面还有多少参数 这样。
要函数内部弹栈从左到右
那么压栈就只能从右到左了。
C语言中函数参数压栈方式为什么是从右到左
栈是先入后出的数据结构.
函数参数从右到左, 那么到函数内部出栈的时候就是从左到右的顺序了.
对于普通函数无区别. 但对于可变参函数, 会根据左侧参数来决定共计有多少参数, 每个类型是什么.
比如 printf scanf这类的.
于是 就设计成从右到左的压栈方式了.
C语言函数压栈顺序
基本正确,补充一点,参数一般是往寄存器里面放,放不下的情况下,才压栈。
printf函数参数入栈
这个现象确实存在,但并非在printf()函数中要先执行函数的原因。这可以用下面的代码作试验,证明不是这个原因。
#include
“stdio.h”//。
int
Add1(int
*p){
return(*p+=1);
}
void
main(void){
int
a=1;
printf(“[%d]
[%d]\n”,Add1(a),a);
}
这段代码的运行结果是[2]
[1],说明并没有先执行函数Add1()。而如果把printf(“[%d]
[%d]\n”,Add1(a),a)改为printf(“[%d]
[%d]\n”,a,Add1(a))则结果是[2]
[2]。这个结果也说明printf()函数确实是从参数列表的右端开始执行的。
那么造成题目中的现象是什么原因呢?这是由C/C++对数组的处理机制造成的。printf()函数在处理数组时只把数组首地址压入栈而并不压入数组下标变量的所有内容(因为没有必要,有首地址就可以输出了)。当printf()函数从参数列表的右端开始一项一项运算压栈到最左端的一个参数后,又从左端的控制符开始按控制符指令一项一项对应弹出。对于其他变量来说,压入的是值,原来计算的结果是什么,弹出的就是什么;而题目中的字符串则不然了,先压入首地址p时,尽管p指向的内容是大小写并存的,但接着被strupr(p)变成全大写了,但压入的首地址还是由strupr(p)返回的同一个地址,弹出来输出时这个地址开始的字串已全是大写字母了……
不知说清楚了没有?供参考……