参数入栈顺序和printf处理输出顺序

温暖阳光236 2010-05-25 10:14:30
还是不大理解,参数的入栈顺序和输出顺序问题
首先,printf的运算是从右到左吗?是的
再次,读取函数的时候,从左到右?是的
最后:printf输出显示时,是从左到右吗?是的
举个例子:看看我理解的正不正确
printf("%d,%d\n", a, b);
1.先运算b,再运算a
2.先读取a,再读取b
3。先输出a,再输出b
4.a先入栈,b跟着入栈(这时a在栈底,b在栈顶),所谓的栈底是指最栈的下面,栈顶是指栈的最上面吗?
5.问题在这里,输出的时候如果是按入栈出栈顺序的话
那么按道理输出的应该先是b,后是a。
但是屏幕上显示的却是先显示a再显示b

所以我就不理解了,希望大家给我讲解下,谢谢
...全文
427 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zfrog 2010-05-27
  • 打赏
  • 举报
回复
。。。居然和编译器有关,在mingw下
int t = 5;
printf("%d %d\n", ++t, t);

t = 5;
printf("%d %d\n", t, ++t);

居然是 6 6 6 6
cattycat 2010-05-27
  • 打赏
  • 举报
回复
入栈是从右向左,输出是从左向右,没错误。
入栈的话,参数已经在printf的函数栈上了,输出的时候有指针标志开始是哪个变量的,没有问题的。
zfrog 2010-05-27
  • 打赏
  • 举报
回复
int t = 5;
printf("%d %d", ++t, t); // 输出的是 6 5

int t = 5;
printf("%d %d", t, ++t); // 输出的是 6 6

楼主说的应该是这个意思吧,先处理最右边的参数,再处理最左边的参数。但是这个应该是与函数参数的入栈顺序无关的,应该是函数内部的处理顺序
温暖阳光236 2010-05-27
  • 打赏
  • 举报
回复
如果好像大家所说的,显示结果与入栈出栈顺序无关的话
还是比较好理解的
显示结果是从左到右的
但是上次大家说说的下面这句说话又该怎么理解呢

“printf函数是从左往右读取,然后将先读取放到栈底,最后读取的放在栈顶,处理时候是从栈顶开始的,所有我们看见的结果是,从右边开始处理的”
这句说话如果正确的话,那么就真的在屏幕上的显示顺序与入栈顺序无关了
yuanzhang198711 2010-05-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zfrog 的回复:]

你可以看看汇编的代码
11: int a = 5;
00401078 mov dword ptr [ebp-4],,5
12: int b = 6;
0040107F mov dword ptr [ebp-8],6
13: printf("%d &d",a,b);
00401086 mov ……
[/Quote]
其实楼主的分析很正确,而且很值得广大网友学习。一楼的解释很明了,希望楼主看一下各个参数的地址,这样你就知道。
qq120848369 2010-05-25
  • 打赏
  • 举报
回复
这些东西测试一下就知道了,常见的测试sizeof(int)来测试基本变量的长度,这些都是与计算机,编译器有关的东西.
ithiker 2010-05-25
  • 打赏
  • 举报
回复
又发一贴
第二步反了,读取的同时就入栈了,这样就没有第四步了
上次给的代码和编译相关,参考下下面的代码:
#include<stdio.h>
int main()
{
int arr[] = {5,7,9,9};
int *ptr = arr;
printf("%d,%d\n",*ptr,*(++ptr));//输出7,7

return 0;
}
周靖峰 2010-05-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zfrog 的回复:]
你可以看看汇编的代码
11: int a = 5;
00401078 mov dword ptr [ebp-4],5
12: int b = 6;
0040107F mov dword ptr [ebp-8],6
13: printf("%d &d",a,b);
00401086 mov eax,dword ptr [ebp-8]
00401089 push eax
004……
[/Quote]
这个是怎么办到的?
user0418 2010-05-25
  • 打赏
  • 举报
回复
不要对任何情况作任何假设。呵呵,见了源码才能知道原因!
zfrog 2010-05-25
  • 打赏
  • 举报
回复
你可以看看汇编的代码
11: int a = 5;
00401078 mov dword ptr [ebp-4],5
12: int b = 6;
0040107F mov dword ptr [ebp-8],6
13: printf("%d &d",a,b);
00401086 mov eax,dword ptr [ebp-8]
00401089 push eax
0040108A mov ecx,dword ptr [ebp-4]
0040108D push ecx
0040108E push offset string "%d &d" (0043101c)
00401093 call printf (00408190)
00401098 add esp,0Ch
我的理解是,printf函数是先根据所有的参数生成一个字符串,再将该字符串输出的屏幕上,
因此不存在先处理哪个,先输出哪个的问题

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧