#include <stdio.h> main() { int i=8; printf("%d,%d,%d,%d,%d尀n",i,i++,++i,--i,i--);

2025-02-28 04:21:00
推荐回答(1个)
回答1:

像这种问题应该与编译器有关,在vc环境下的结果是8788-8-8
因为,在vc下,printf函数中,右自增自减是无法实现的,也就是等于没有,可以看看反汇编的代码
0040d78f
mov
eax,dword
ptr
[ebp-4]
0040d792
neg
eax
0040d794
mov
dword
ptr
[ebp-8],eax
0040d797
mov
ecx,dword
ptr
[ebp-8]
0040d79a
push
ecx
这是最后一个参数的反汇编,因为在c语言中,参数的调用,是从右到左的参数压入堆栈,所以先压入的是最后一个i,由于用了负号,所以,最后一个是-8,从右到左第二个一样,也用了负号,所以也是-8依此第三个,没有加负号,所以是8,再依次,还是8,最后两个,也就是从左到右第一二个,从右到左第5
,6个,开始有变化了,我可以给你反汇编的代码看看,他们是左自增(自减),也就是先自增再使用,所以从右到左第5个,是7,是由于它自减,你可以看看反汇编代码
0040d7bb
mov
edx,dword
ptr
[ebp-4]
0040d7be
sub
edx,1
0040d7c1
mov
dword
ptr
[ebp-4],edx
0040d7c4
mov
eax,dword
ptr
[ebp-4]
0040d7c7
push
eax
可以看到,先是把i的值给了寄存器值是8,再减-1就是7了,再把值赋值给i,那个,[ebp-4]就是i的地址,压入堆栈的时候是7,再看看最后压入堆栈的,
0040d7c8
mov
ecx,dword
ptr
[ebp-4]
0040d7cb
add
ecx,1
0040d7ce
mov
dword
ptr
[ebp-4],ecx
0040d7d1
mov
edx,dword
ptr
[ebp-4]
0040d7d4
push
edx
开始,[ebp-4]由于开始已经是7了,所以,add
加1后,就是8了,再把8给,[ebp-4]所以,最后i的值还是8,压入堆栈的时候,edx是8,所以,依此排列下来,压入的顺序就是,
-8
-8
8
8
7
8
最后堆栈的特点你应该了解吧,先入的后出,也就是,从下面开始调出,
最后,就是
8788-8-8
看c看不懂的时候,
可以反汇编看下,