printf问题
在《小甲鱼零基础入门学习C语言》中“第三章顺序程序设计”PPT第18页有如下格式输入输出问题:请问有大神能分析下结果为何是这样吗? 自增和自减,这个是不同的编译器运算会有不同的结果,你可以尝试,把每一个都拿出来单独输出,这样就会有你的答案了 编译器的问题么? 不错支持 本帖最后由 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。 EzioA 发表于 2016-6-21 13:45
反汇编之后得出这样的结论,如图。
在内存里面,i的值以dword的形式(64位)被存储在ebp-4的地方,也就是 ...
非常感谢,分析得很细致透彻,明白鸟~
还有后面的建议也很赞!
感谢~ 来学习下 哈哈{:10_256:}理解能力不是很强 但是 可以看看 哈哈 我也不懂
页:
[1]