f904399233 发表于 2016-6-21 09:08:19

printf问题

在《小甲鱼零基础入门学习C语言》中“第三章顺序程序设计”PPT第18页有如下格式输入输出问题:


请问有大神能分析下结果为何是这样吗?

夕阳游子 发表于 2016-6-21 09:39:36

自增和自减,这个是不同的编译器运算会有不同的结果,你可以尝试,把每一个都拿出来单独输出,这样就会有你的答案了

542624047 发表于 2016-6-21 09:54:46

编译器的问题么?

www.sxzisha.com 发表于 2016-6-21 11:28:28

不错支持

EzioA 发表于 2016-6-21 13:45:52

本帖最后由 EzioA 于 2016-6-21 13:47 编辑

反汇编之后得出这样的结论,如图。
在内存里面,i的值以dword的形式(64位)被存储在ebp-4的地方,也就是图的最下面的位置。
首先,C语言的参数传递是从右往左的,并且用到栈空间。图的上方就是栈空间中使用到的位置。

第一个参数为-i--,从ebp-4的位置取出i,算出-i的值后,将-i存储在ebp-8的位置,然后把ebp-8的数据送到栈里面,也就是上半部分中最下面的-i。

第二个参数为-i++,从ebp-4的位置取出i,算出-i的值,存储在ebp-0c H的位置,然后将ebp-0c H的数据送到栈里面,也就是上半部分中第二个-i。

第三个参数为i--,从ebp-4的位置取出i,直接存储在ebp-10 H的位置,然后将ebp-10 H的数据送入栈,也就是上半部分的第三个数据,i。

第四个参数为i++,从ebp-4的位置取出i,直接存储在ebp-14H的位置,然后将ebp-14 H的数据送入栈,也就是上半部分的第四个数据,i。

第五个参数为--i,从ebp-4的位置取出i,计算出i-1的值,用i-1覆盖ebp-4的数据,也就是原来ebp-4位置处存储的是i,现在变成了i-1。然后取出ebp-4的数据,将之入栈,也就是上半部分第五个数据,i-1。

第六个参数为++i,从ebp-4的位置取出i-1,计算出(i-1)+1的值,然后覆盖ebp-4的数据,也就是ebp-4位置处的数据又变成了i。然后取出ebp-4的数据,入栈,也就是上半部分的第六个数据,i。

然后依次出栈:i   i-1   i   i   -i   -i
函数输出的结果也就是这个样子。

其实这样看上去,-i++和-i--这种语句最好不要使用,因为++和--的优先级比-还要高,但是在使用的时候,先使用-i的数据,才进行++和--操作。在这里,-i++和-i--作为printf()参数的时候,++和--甚至是被忽略了,函数接接收的数据只是-i和-i。

f904399233 发表于 2016-6-22 07:59:41

EzioA 发表于 2016-6-21 13:45
反汇编之后得出这样的结论,如图。
在内存里面,i的值以dword的形式(64位)被存储在ebp-4的地方,也就是 ...

非常感谢,分析得很细致透彻,明白鸟~
还有后面的建议也很赞!
感谢~

屁哥 发表于 2016-6-22 10:24:03

来学习下 哈哈{:10_256:}理解能力不是很强 但是 可以看看 哈哈

学习电脑 发表于 2016-6-22 15:58:36

我也不懂
页: [1]
查看完整版本: printf问题