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 = *ptr + 123; ptr++; 此时ptr指向数组arr中的第二个元素7,故*ptr = 7,*(ptr - 1) = 129。语句printf("%d, %d\n", *ptr, *(++ptr)); 应该是先让ptr加1后再打印——其参数计算时按照从右到左压栈,故输出为8,8。

以此类推,当我们选择C++中的"cout << “ 语句也是一样的,按照从右到左的顺序。

下面代码与上述代码结果一致:
#include <iostream>
using namespace std;
int main()
{
         int arr[] = {6,7,8,9,10};
         int * ptr = arr;
         *(ptr++) += 123;
         cout << *ptr << ", " << *(++ptr) << endl;
         return 0;
}

#include <stdio.h>
void main()
{
     int a = 1;
     printf("%d %d \n", a, ++a);
}
   输出结果为"2,2"

void main()
{
     int a = 1;
     printf("%d %d \n", a, a++);
     printf("%d \n", a);
}
上面的语句在VC6.0中输出为
1,1
2

int main()
{
         int i=5,k;
         k=(++i)+(++i)+(i++);
         printf("%d\n",i);
         i=5;
         printf("%d,%d,%d,%d\n",i,k,(++i)+(++i)+(i++),i);
}

结果:
8
7,21,21,5

CSDN上一篇博客从汇编解析为什么是从右到左

http://blog.csdn.net/casimodo13/article/details/250380

C中prngtf是从右到左压栈的

时间: 2024-11-05 11:43:44

C中prngtf是从右到左压栈的的相关文章

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++)); ret

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&

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);

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

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

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

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

JavaScript基础 lastIndexOf 从右往左查找 返回一个子字符串在原始字符串中的索引

镇场诗: 清心感悟智慧语,不着世间名与利.学水处下纳百川,舍尽贡高我慢意. 学有小成返哺根,愿铸一良心博客.诚心于此写经验,愿见文者得启发.------------------------------------------ code: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=ut

48.输入任意正整数,编程判断该数是否为回文数(回文数是指从左到右读与从右到左读一样,如12321)

//1.输入一个数,将其每一位分离,并保存如一个数组 //2.判断数组最后录入的一位是第几位 //3.循环判断是否满足回问数的要求 #include<iostream> using namespace std; int main() { int n,temp; int k=0; int a[20]; cout<<"please input an number: "<<endl; cin>>n; for(int i=0;i<20;i+

Android ProgressBar 反向进度条/进度条从右到左走

最近的项目,有个需求需要使用条状图显示比例,并且右对齐,见下图: 我想到了使用进度条,这样不就不需要在代码动态绘制条状了,省了很多活. 那么进度条怎样从右向左显示呢? 方案一: 将ProgressBar的前背景反着用,将前景色设置为和整个大背景同一色,将背景设置为你要的条状图颜色,这样就看不出实际的进度,看到的是进度背景,在视觉上看上去就是右对齐了.实际上还是原来那个进度条. 缺点:我这个进度条是放在ListView的item中的,点击listview,因为listview有选中的背景显示出来,

开车经过路口该谁让谁?交警:右转让左转 转弯让直行

开车经过路口该谁让谁?交警:右转让左转 转弯让直行 "海口不少路口没有设置交通指示灯,有些人过路口时不知道该谁让谁,存在安全隐患."近日,不少市民称不明白在没有交通指示灯,也没有交警指挥的交叉路口该如何通行. 很多司机"先来先走"频频抢道 3月14日上午11点20分,记者来到城西路.学院路和坡巷路的三叉口,此时临近中午下班高峰期,附近经过的车辆不少,然而过往的驾驶员在通过 路口时,基本遵循"先来先走"的规则,谁先抢占了道路,谁就先通过.一辆货车欲