精华内容
下载资源
问答
  • 函数参数的压栈顺序

    2021-12-01 19:07:17
    对于一般的c++是从右边开始压栈,可以看两个例子: int arr[]={1,2,3,4 }; int *ptr=arr; PrintMN(*(++ptr),*ptr); ptr=arr; PrintMN(*ptr,*(++ptr)); void PrintMN(int m, int n) { qDebug()<<'m'<...

    对于一般的c++是从右边开始压栈,可以看两个例子:

        int arr[]={1,2,3,4 };
        int *ptr=arr;
        PrintMN(*(++ptr),*ptr);
    
        ptr=arr;
        PrintMN(*ptr,*(++ptr));
    
    void PrintMN(int m, int n)
    {
        qDebug()<<'m'<<m;
        qDebug()<<'n'<<n;
    }
    

    上文在QT的输出结果是
    m 2
    n 1
    m 2
    n 2

    	int arr[]={1,2,3,4 };
        int *ptr=arr;
        PrintMN(*(ptr++),*ptr);
    
        ptr=arr;
        PrintMN(*ptr,*(ptr++));
    

    上文在QT的输出结果是
    m 1
    n 1
    m 2
    n 1

    先压栈的参数,就先计算。从右边开始压栈有什么好处呢?第一,第一个参数最后是放栈顶,方便使用。第二,如果是可变参数,第一个参数是表示可变参数数量,也放在栈顶,方便确定数量。

    不同的编译器的压栈顺序不一样,上述写法,个人认为并不可取。同一个编译器,有时也令人费解,例如如下例子,在Qt里面的输出结果并不符合预期。

    int t = 1;
    PrintAB(t++, t);
    
    void PrintAB(int a, int b)
    {
        qDebug()<<'a'<<a;
        qDebug()<<'b'<<b;
    }
    

    在QT的输出结果是
    a 1
    b 2

    VS中设置压栈顺序:首先打开一个工程—>调试—>xxx项目属性—>配置属性—>C/C++—>高级
    __cdecl 是C Declaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈

    展开全文
  • #include <stdio.h> int main(){ int arr[] = {1,2,3,4}; int* ptr = arr; printf("%d,%d", *ptr, *(++ptr));...原因是函数的参数入栈顺序为自右向左,因此先入栈*(++ptr),再入栈 *ptr。 ...

    转载自春夜喜雨 http://blog.csdn.net/chunyexiyu

    #include <stdio.h>
    
    int main(){
        int arr[] = {1,2,3,4};
        int* ptr = arr;
        printf("%d,%d", *ptr, *(++ptr));
        return 0;
    }
    
    

    输出结果为 2,2
    原因是函数的参数入栈顺序为自右向左,因此先入栈*(++ptr),再入栈 *ptr。

    展开全文
  • 函数参数压栈顺序,即关于__stdcall和__cdecl调用方式的理解 __stdcall和__cdecl都是函数调用约定关键字。 __stdcall:参数由右向左压入堆栈;堆栈由函数本身清理。 __cdecl:参数也是由右向左压入堆栈;但堆栈由...

    函数参数压栈顺序,即关于__stdcall和__cdecl调用方式的理解

    __stdcall和__cdecl都是函数调用约定关键字。

    __stdcall:参数由右向左压入堆栈;堆栈由函数本身清理。

    __cdecl:参数也是由右向左压入堆栈;但堆栈由调用者清理。

    展开全文
  • 1.调用格式为 printf("", );...参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则将会出现意想不到的错误。2.格式化字符%d 十进制有...

    1.调用格式为  printf("", );

    其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符, 用来确定输出内容格式。参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则将会出现意想不到的错误。

    2.格式化字符

    %d 十进制有符号整数

    %u 十进制无符号整数

    %f 浮点数

    %s 字符串

    %c 单个字符

    %p 指针的值

    %e 指数形式的浮点数

    %x, %X 无符号以十六进制表示的整数

    %0 无符号以八进制表示的整数

    %g 自动选择合适的表示法

    说明:

    (1). 可以在"%"和字母之间插进数字表示最大场宽。 例如: %3d 表示输出3位整型数, 不够3位右对齐。 %9.2f 表示输出场宽为9的浮点数, 其中小数位为2, 整数位为6, 小数点占一位, 不够9位右对齐。%8s 表示输出8个字符的字符串, 不够8个字符右对齐。 如果字符串的长度、或整型数位数超过说明的场宽, 将按其实际长度输出。 但对浮点数, 若整数部分位数超过了说明的整数位宽度, 将按实际整数位输出; 若小数部分位数超过了说明的小数位宽度, 则按说明的宽度以四舍五入输出。另外, 若想在输出值前加一些0, 就应在场宽项前加个0。 例如: %04d 表示在输出一个小于4位的数值时, 将在前面补0使其总宽度为4位。如果用浮点数表示字符或整型量的输出格式, 小数点后的数字代表最大宽度, 小数点前的数字代表最小宽度。 例如: %6.9s 表示显示一个长度不小于6且不大于9的字符串。若大于9, 则第9个字符以后的内容将被删除。

    (2). 可以在"%"和字母之间加小写字母l, 表示输出的是长型数。例如: %ld 表示输出long整数, %lf 表示输出double浮点数。

    (3). 可以控制输出左对齐或右对齐, 即在"%"和字母之间加入一个"-" 号可说明输出为左对齐, 否则为右对齐。例如: %-7d 表示输出7位整数左对齐,%-10s 表示输出10个字符左对齐。

    3. 一些特殊规定字符

    \n换行

    \f清屏并换页

    \r回车

    \t Tab符

    \xhh表示一个ASCII码用16进表示,

    其中hh是1到2个16进制数

    int a=1234;

    printf("a=%d\n",a); //a=1234

    printf("a=%2d\n",a); //a=1234 超过2位,按实际输出

    printf("a=%6d\n",a); //a= 1234 不足6位,右对齐

    printf("a=%06d\n",a); //a=001234 不足6位,前面补0

    printf("a=%-6d\n",a); //a=1234 '-'左对齐

    int* i=&a;

    printf("i=%p\n",i); //i=0012FF44 输出指针的值,即地址

    float m=8888.8888; //float 单精度型浮点数 有效位数是6位或7位,根据不同的浮点数会有不同

    float m1=8888.8888f; //在后面加上f或F,编译警告:truncation from'const double'to 'float'

    //编译器默认浮点数为double

    float m2=8888.888f;

    double n=8888.8888;

    double n1=8888888888.88888888; //double 双精度型浮点数 有效位数是15位

    printf("m=%f\n m1=%f\n m2=%f\n n=%lf\n n1=%f\n",m,m1,m2,n,n1); // m=8888.888672

    // m1=8888.888672

    // m2=8888.887695

    // n=8888.888800

    // n1=8888888888.888889

    //%f的默认输出小数位数就是6位不管有没有l

    /*printf的%f说明符的确既可以输出float型又可以输出 double型。 根据"默认参数提升"规则(在printf这样的函数的

    可变参数列表中 ,不论作用域内有没有原型,都适用这一规则)float型会被提升为double型。因此printf()只会看到

    双精度数。严格地讲,%lf在printf下是未定义的,但是很多系统可能会接受它。要确保可移植性,就要坚持使用%f。*/

    printf("m4=%4.2f\n",m); //宽度总共4位,小数两位,小数点一位,整数一位,这里整数超过宽度规定,按实际整数位输出

    printf("m5=%9.6f\n",m); //浮点数小数部分不足6位,右对齐

    printf("m6=%9.2f\n",m); //整数部分不足6位,右对齐;小数部分超过2位,四舍五入

    char c[20]="Hello,world!";

    printf("c=%s\n",c);

    printf("c=%6.9s\n",c); //c=Hello,wor 6.9s表示输出一个长度长度不小于6且不大于9的字符串。若大于9, 则第9个字符以后的内容将被删除。

    参数压栈顺序

    int arr[]={6,7,8,9,10};

    int *ptr=arr;

    *(ptr++)+=123;

    printf("%d,%d",*ptr,*(++ptr));

    输出结果:8,8

    解释:C中printf计算参数时是从右往左压栈的。

    即当调用函数printf()时,首先从右往左将读入的参数压入栈,然后函数被调用时,再从栈顶开始取数据进行计算。所以可以理解为“从右向左求值并压栈”。

    不光printf函数是这样,函数都一样,所有参数也是自右像左计算的。 原因是,如果一个函数有多个参数,比如 int fun (int a, int b, int c); 调用时,总是从最后一个参数开始压栈。 也就是c先进栈,其次是b,最后才是a。 同理, 如果你这样写: int main () { int i = 0; printf ("%d,%d,%d",++i,++i,++i); } 先计算最后一个参数(即最右一个++i),压入1,以此类推,再压入2,3和字符串"%d,%d,%d"的首地址。 所以 , 程序的输出是 3,2,1

    展开全文
  • 看到有人提问到,在处理printf/cout时,压栈顺序是什么样的?大家都知道是从右往左,也就是说从右往左的计算,但是,这里的计算不等于输出。a++和++a的压栈的区别:在计算时,遇到a++会记录此时的a的值作为最后的...
  • printf压栈顺序

    2021-11-03 10:43:08
    其实,在处理printf时,压栈顺序为从右往左,也就是说从右往左的计算(“计算”不等于“输出”)。 在计算时,遇到x++会记录此时的x的值作为最后的输出结果。遇到x和++x的时候则不会将此时的计算结果作为最终的输出...
  • 然而,了解了以上内容还远不够理解函数压栈出栈的原理,于是对main函数下面对应的17行做了分析,考虑linux平台下的情况[],主要针对ESP和EBP两个栈寄存器作分析解释。以下是通过单步调试的方式得到的结果: 图1 未...
  • C语言函数调用时参数压栈的顺序以及...有没有人知道C语言为什么要进行这样的参数压栈顺序的选择啊?求指教啊……#include int Add1(int a, int b){printf("Add1\n");return a+b;}int Add2(int a, int b){printf("A...
  • 其中退出处理程序的执行顺序与调用顺序相反 wait(int * status);//阻塞到子进程终止,将终止信息通过status指向的整形变量返回 waitpid(pid, int* status, int option);//根据pid值得不同,标识等待不同的子进程。 ...
  • 栈的生长方向以及函数参数列表的压栈顺序 标签(空格分隔): 栈的内存生长方向、函数参数压栈顺序、栈的特性 一、栈的特点 我们都知道栈的特性是先进后出,就好比一排汽车进入死胡同,只有最外面的汽车都倒车开走...
  • 一、不同类型矩阵变换先后顺序、 二、渲染前不设置单位阵、 三、矩阵的压栈和出栈原理分析、 四、矩阵的压栈和出栈代码示例、 五、相关资源
  • /*输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列5、4、3、2、1是该压栈序列对应的一个弹出...
  • 想了解浅谈C语言函数调用参数压栈的相关问题的相关内容吗,在本文为您仔细讲解函数调用压栈的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:函数调用压栈,下面大家一起来学习吧。参数入栈的顺序以前在...
  • printf() 函数压栈方式

    2021-05-23 08:24:10
    但是,这里不光涉及到参数的入栈顺序,还涉及到以表达式做为函数参数时,表达式的求值 顺序。 看这个例子: 如果有这样一个函数: int max(int a, int b); 我这样调用它: int x = 10; int y = 6; int z...
  • }//将余数压栈 int stackLength = StackLength(&s); for (int i = 0; i ; i++) { int num; Pop(&s, &num); printf("%d", num); }//将栈中的数依次弹出 printf("\n"); } int main() { InitStack(&s); Numerical_...
  • 压栈之后,fp指针指向sp-4的地址 51 60: e28db004 add fp, sp, #4 ;加4之后,fp指针指向栈顶Sp 52 64: e24dd008 sub sp, sp, #8 ;栈空间大小为8个字节,具体栈分布情况见下图2 53 int a; 54 a = foo(1,2,3,4); 55 68...
  • pop 左子树 右子树 根 stack 根 左子树 根 根 右子树 根 根 根据上面分析: 压栈顺序相同:根、左子树、右子树。 出栈顺序不同:先/中:左子树,根,右子树。 \qquad\qquad\qquad 后: \quad 左子树,右子树,根。 ...
  • 参数入栈的顺序以前在面试中被人问到这样的问题,函数调用的时候,参数入栈的顺序是从左向右,还是从右向左。参数的入栈顺序主要看调用方式,一般来说,__cdecl 和__stdcall 都是参数从右到左入栈。看下面的代码:#...
  • 关注、星标公众号,直达精彩内容ID:技术让梦想更伟大作者:李肖遥如果大家细心的话应该知道c/c++语言函数参数入栈顺序为从右至左,那么为什么这样呢?来看看两个知识点:参数的计算顺序压栈顺...
  • 测试验证的芯片是stm32f103rct6 首先查看进入中断或异常前后的寄存器数据: 上图左边是进入中断前的寄存器值,右边是进入中断后的寄存器值,通过SP值得前后对比,可以看出在进入中断后被压了(0x20000330-0x20000310...
  • 下面要给大家分享的是一个和...例:序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是这个压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是这个压栈序列的弹出序列。注:这2个序列的长度是相等的。思路1代码实现:c...
  • 入栈操作: 按照压栈序列的顺序执行。 出栈操作: 每次入栈后,循环判断 “栈顶元素 === 弹出序列的当前元素” 是否成立,将符合弹出序列顺序的栈顶元素全部弹出。 import java.util.Stack; class Solution { ...
  • printf函数是从左往右读取,然后将先读取放到栈底,最后读取的放在栈顶,处理时候是从栈顶开始的,所有我们看见的结果是,从右边开始处理的。 我们先看下这段代码,C语言经典面试题: #include <...
  • 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权...下面我们来看2个案例,分析下c语言中函数参数处理顺序。 第一个: #include "stdio.h" void fn(int a,int b,int c) { printf("%d,%d,%d", a, b, c); }
  • 文章目录顺序表的增删查改顺序表静态顺序表:使用定长数组存储元素动态顺序表:使用动态开辟的数组存储顺序表的初始化顺序表的销毁打印顺序表数据顺序表尾插数据顺序表头插数据顺序表头删数据顺序表指定位置插入元素...
  • __cdecl压栈顺序实例 明白计算:计算是从右到左计算的 栈和寄存器变量:x++,是将计算结果存放到栈空间,最后是要出栈的:而++x和x是将计算结果直接存放到某个寄存器变量中(是同一个),所以计算完最后输出时,++x和x的结果...
  • java实现顺序

    2021-03-11 13:17:42
    栈的顺序存储结构为顺序栈。通常把数组中下标为0的一端作为栈底,同时附设指针top指向栈顶元素的位置,栈空时top = -1。以下是java实现顺序栈的代码:package com.dhy.seqstack;/*** 顺序栈* @author Administrator*...
  • 例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,5,2,3,1就不可能是该压栈序列的弹出序列。输入:每个测试案例包括3行:第一行为1个整数n(1<=n<=10...
  • java中压栈和弹栈

    2021-03-10 04:12:16
    比如你想让Vector容器中的对象按字典顺序进行排序,你就要自己实现。1.1、Vectorjava.util.Vector中包含的元素可以通过一个整型的索引值取得,它的大小可以在添加或移除元素时自动增加或缩小。Vector的操作很简单,...
  • 栈的顺序存储结构 1.顺序栈的存储结构 #define MAXSIZE 100 //顺序栈存储空间的初始分配 typedef struct{ SElemType *base; //栈底指针 SElemType *top; //栈顶指针 int stacksize; //栈可用的最大容量 }...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,379
精华内容 15,751
关键字:

压栈顺序