c语言运算符顺序printf函数运算顺序为什么从右到左

渣渣的疑惑
RT...看到有类似的题目,说是从右到左,,
蓝后在VS2012中写了如下的代码...但是运行出来的结果如下,,
这是为啥... &留一疑惑在这先.
ok,这里有了一个解释:
i++会创建一个拷贝 %d取值输出,参数的传递是从右到左压入栈,所以从右边开始,i++,此时拷贝i=2 ,然后i+1=3,到左侧i=3但此时并不出输出,继续其他的运算,++i,得到i=4,此时仍不输出,到i++,记录拷贝为4,计算后得到i=5。所有运算完成,开始输出,从左往右为4(拷贝),5,5,2(拷贝)。
这里++i,和i输出一样是因为两者寻址一样
--------------------------------------------------------------------------------------
以上,来自某同学的解释
/* test the execution order of arguments of function printf */
#include &stdio.h&
#include &stdlib.h&
void senario1(void);
void senario2(void);
int main()
senario1();
senario2();
system(&pause&);
void senario1()
int i = 2;
printf(&%d %d %d %d&,i++,++i,i,i++);
void senario2()
int i = 2;
printf(&%d &,i++);
printf(&%d &,i);
printf(&%d &,++i);
printf(&%d&,i++);
/* The result is 4 5 5 2 ,2 3 4 4 why the first senario shows this result???*/
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:986次
排名:千里之外1362人阅读
笔试和面试题(9)
#include &stdio.h&
int main(int argc, char *argv[])
int b = 3;
int arr[] = { 6, 7, 8, 9, 10};
int *ptr =
printf( &%d, %d\n&, *ptr, *(++ptr) );
求输出结果?
开始看这个题目觉得很简单的,无非就是考i++和++i的问题,后来发现,在printf那里出问题了,我以为参数是按照stdcall顺序的,即从左到右,
可结果确实从右到左,查阅资料表明,C语言里面的函数参数入栈都是从右到左的顺序(之前忘记了,汗~~~),究其原因。看到某篇文章,称那
是因为C语言支持不定参数而要求这样做的,因为这样的话,右边的参数先入栈,在栈底,而左边的却在栈顶,调用参数的话就只需要从栈依
次取出即可,而不需要参数个数。倘若参数入栈是从左到右,那么在遇到动态参数个数的问题时,由于函数调用的参数个数是不确定的,所以
对于取参数就遇到了不好处理的问题了,因为不知道栈顶的那个参数对应于函数的哪个参数,而如果采用参数从右到左顺序的话,那么就不需
要知道参数个数,直接从栈里取参数,然后和函数里面的参数从左到右匹配即可。这种解释,我觉得还是很不错的。
回到本题来,因为入栈是从右到左的,所以先会执行++ptr操作,然后把此时的数据值入栈,然后把左边的*ptr入栈,这时的ptr已经自增了,所以
本题的答案是:8, 8
事实发现当采用如下方式输出时:printf( &%d, %d, %d\n&, *ptr, *(++ptr), *ptr );
结果是:8, 8, 7
补充一点,由于printf采用的是动态参数个数,当采用如下方式输出数据时:printf( &%d, %d&, 1, 3, 5);
输出结果是:1, 3
表明printf摒弃了后面的5,即print根据格式字符串决定输出,然后按照格式字符串的规则,对于函数参数从左到右匹配,如果匹配完了之后还剩
下其他参数,那么函数将会摒弃这些参数。
附:好久没认真学习过C语言了,忘记了许多东西,现在复习起来真有点惭愧。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:97458次
积分:1818
积分:1818
排名:第14440名
原创:80篇
评论:21条
(1)(1)(1)(1)(1)(2)(2)(1)(3)(1)(1)(2)(4)(10)(7)(19)(11)(16)(1)(1)(1)(3)计算机基础(4)
C/C++(51)
&&& 上学期学习了汇编语言,并在操作系统实验中使用了汇编+C语言混合编程,中间也了解了一些C语言与汇编语言的对应关系。
&&& 由于汇编语言是底层的编程语言,各种函数参数都要直接控制栈进行存取,在混合编程中,要用汇编来调用C函数,当然就要知道参数的压栈情况了。
&&& 当知道C函数的参数压栈顺序是从右到左时,我觉得很奇怪,因为大多数情况下,人们的习惯是从左到右的,难不成设计者学咱们中国古代写字从右到左的习惯不成?
&&& 当时只是记下了这个规则而已,并没有去探究这其中的缘由,后来在实验中自己用汇编实现了printf和scanf函数的基本功能,尝到了压栈从右到左的好处,但是仍然没有多想。
&&& 直到前阵子看斯坦福大学公开课的时候,老师解释了一番才恍然大悟!
&&& 那么,这是为什么呢?
&&& 要回答这个问题,就不得不谈一谈printf()函数,printf函数的原型是:printf(const char* format,…)
&&& 没错,它是一个不定参函数,那么我们在实际使用中是怎么样知道它的参数个数呢?这就要靠format了,编译器通过format中的%占位符的个数来确定参数的个数。
&&& 现在我们假设参数的压栈顺序是从左到右的,这时,函数调用的时候,format最先进栈,之后是各个参数进栈,最后pc进栈,此时,由于format先进栈了,上面压着未知个数的参数,想要知道参数的个数,必须找到format,而要找到format,必须要知道参数的个数,这样就陷入了一个无法求解的死循环了!!
&&& 而如果把参数从右到左压栈,情况又是怎么样的?函数调用时,先把若干个参数都压入栈中,再压format,最后压pc,这样一来,栈顶指针加2便找到了format,通过format中的%占位符,取得后面参数的个数,从而正确取得所有参数。
&&& 所以,如果不存在…这种不定参的函数,则参数的压栈顺序无论是从左到右还是从右到左都是没关系的。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:133694次
积分:3898
积分:3898
排名:第6214名
原创:247篇
转载:13篇
评论:76条
计算机科学与技术
阅读:1677
阅读:6555
文章:27篇
阅读:23074
文章:19篇
阅读:5470
文章:32篇
阅读:17990
文章:11篇
阅读:8917
文章:11篇
阅读:4857
(5)(1)(13)(7)(6)(5)(4)(4)(15)(27)(46)(46)(41)(22)(8)(12)2016年2月 C/C++大版内专家分月排行榜第三2016年1月 C/C++大版内专家分月排行榜第三
2013年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第三
2015年9月 VC/MFC大版内专家分月排行榜第二2015年7月 硬件/嵌入开发大版内专家分月排行榜第二2014年5月 VC/MFC大版内专家分月排行榜第二2014年3月 VC/MFC大版内专家分月排行榜第二2013年10月 VB大版内专家分月排行榜第二2013年7月 VB大版内专家分月排行榜第二2012年5月 VB大版内专家分月排行榜第二2012年4月 VB大版内专家分月排行榜第二2012年2月 VB大版内专家分月排行榜第二2011年11月 VB大版内专家分月排行榜第二
2015年11月 VC/MFC大版内专家分月排行榜第三2015年6月 VC/MFC大版内专家分月排行榜第三2015年2月 VC/MFC大版内专家分月排行榜第三2014年1月 VC/MFC大版内专家分月排行榜第三2012年3月 VB大版内专家分月排行榜第三2011年12月 VB大版内专家分月排行榜第三2011年10月 VB大版内专家分月排行榜第三
2012年1月 扩充话题大版内专家分月排行榜第二
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 c语言printf函数 的文章

 

随机推荐