5-2-2 printf参数从右往左压栈

5-2-2 C中printf计算参数时是从右到左压栈的

#include <stdio.h>
int main (int argc, char **argv)
{
    int b = 3;
    int arr[] = {6,7,8,9,10};
    int *ptr = arr;
//    *(ptr++) += 123;
//    printf ("%d,%d\n",*ptr,*(++ptr));
    printf ("%d,%d\n",*ptr,*(ptr++));
    return 0;
} /* ----- End of main() ----- */

输出
7,6

关于*(ptr++)执行的先后顺序:我一开始认为:由于括号优先,因此先执行括号中的自加,再取值。

可实际上是:先取ptr指向的数组元素的值,再自加。并且去掉括号即*ptr++,它的结果完全相同。

#include <stdio.h>
int main (int argc, char **argv)
{
    int b = 3;
    int arr[] = {6,7,8,9,10};
    int *ptr = arr;
    *(ptr++) += 123;
    printf ("%d,%d\n",*ptr,*(++ptr));
//    printf ("%d,%d\n",*ptr,*ptr++);
    return 0;
} /* ----- End of main() ----- */

输出
8,8

程序运行完后数组arr[]={129,7,8,9,10}。

时间: 2024-10-03 14:47:05

5-2-2 printf参数从右往左压栈的相关文章

C/C++---printf/cout 从右至左压栈顺序实例详解

__cdecl压栈顺序实例 明白计算:计算是从右到左计算的 栈和寄存器变量:x++,是将计算结果存放到栈空间,最后是要出栈的:而++x和x是将计算结果直接存放到某个寄存器变量中(是同一个),所以计算完最后输出时,++x和x的结果总是相同的. ??用个小例子来说明下: int x=5; printf("%d %d\n",x,x++); int y=5; printf("%d %d\n",y++,y); int z=5; printf("%d %d %d\n&

thiscall仅仅应用于“C++”成员函数(this指针存放于CX寄存器,参数从右到左压)

_stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈.VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上"@"和参数的字节数.格式为:[email protected]. C调用约定(即用__cdecl关键字说明)按从右至左的顺序压参数入栈,由调用者把参数弹出栈.对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变参数的函数只能使用该调用约定).另外,在函数名修饰约定方面也有所不同.  _cd

C中prngtf是从右到左压栈的

c汇编 例子程序如下:#include <stdio.h>int main(){     int arr[] = {6,7,8,9,10};     int * ptr = arr;     *(ptr++) += 123;     printf("%d, %d\n",*ptr,*(++ptr));     return 0;}        一开始,指针ptr指向第一个元素6,见语句int *ptr = arr.接着的语句*(ptr++) += 123可以解析为:*ptr

C语言中函数参数为什么是由右往左入栈的?

先通过一个小程序来看一看: #include void foo(int x, int y, int z) { printf("x = %d at [%X]n", x, &x); printf("y = %d at [%X]n", y, &y); printf("z = %d at [%X]n", z, &z); } int main(int argc, char *argv[]) { foo(100, 200, 300);

C语言函数参数压栈顺序为何是从右到左?(从左向右的话,碰到printf的会陷入死循环)

上学期学习了汇编语言,并在操作系统实验中使用了汇编+C语言混合编程,中间也了解了一些C语言与汇编语言的对应关系. 由于汇编语言是底层的编程语言,各种函数参数都要直接控制栈进行存取,在混合编程中,要用汇编来调用C函数,当然就要知道参数的压栈情况了. 当知道C函数的参数压栈顺序是从右到左时,我觉得很奇怪,因为大多数情况下,人们的习惯是从左到右的,难不成设计者学咱们中国古代写字从右到左的习惯不成? 当时只是记下了这个规则而已,并没有去探究这其中的缘由,后来在实验中自己用汇编实现了printf和scan

函数参数的压栈顺序

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源) 先来看一道面试题: 设int arr[]={1,2,3,4 }; int *ptr=arr; printf("%d,%d",*ptr,*(++ptr)); 面试题的答案是: 2, 2 这个面试题为什么会这样呢? 原因就跟函数的压栈顺序有关,先压栈哪一个,哪一个就会被先计算,后压栈哪一个,那一个就会被后计算. 对于常见的C++程序,像缺省_cdecl或使用_stdcall的函数压栈顺序都

printf()参数的处理

下面程序的输出为? #include <stdio.h> int main(void) { int a=10,b=20,c=30; printf("%d..%d..%d",a+b+c,(b = b*2),(c = c*2)); return 0; } 答案是120..40..60 这是因为C语言里函数的参数默认是从右往左处理的,输出时是从左往右

printf参数的问题

根据前面的某一篇的文章,可以清楚的看到:对于每一个函数,通过这个函数的[ebp+x]就可以直接访问到它调用的时候传进来的形参的值,通过[ebp-x]就可以直接访问它的局部变量. 所以printf这个函数不定参数的实现是通过栈机制实现的,在传入实参的时候,从右向左一次把各个参数压入栈,但是这些压入栈的数据是没有类型区分的,就是把相应的数据依次放到栈中排好.最后压入栈的那个参数“%d%d%d”等类似的参数,才是决定printf参数类型的东西.等到程序的执行控制权到达printf中以后,printf就

C: printf参数执行顺序与前置后置自增自减的影响

起源: 今天在了解副作用side-effect的过程中,看到了下面的网页,把我带到了由printf引起的一系列问题,纠结了一整天,勉强弄懂. 第一个代码没什么好解释的.而第二个printf("return of swap is %d\tx=%d,y=%d\n",swap(&x,&y),x,y)居然是"return of swap is 1 x=1,y=0",输出的x和y的值并没有改变! 原因在于C语言函数参数的处理是从右到左的压栈顺序(这个我在看第一