zfg 发表于 2013-10-17 08:17:38

关于自增与自减的困惑


关于自增与自减的问题,请各位高手帮帮,才学c
int i = 1;

printf (" %d\n ",(++i)+(++i));
printf (" %d\n ", --i);

结果怎么是6和2呢?应该是5和2啊?

6
2
Press any key to continue


int i = 1, j = 1, p, q, m, n;

p = ( i++ ) + ( i++ ) + ( i++ );
q =j+++j+++j++ ;
m = ( ++i ) + ( ++i ) + ( ++i );
n =++j+++j+++j ;

printf (" p = %d\n q = %d\n m = %d\n n = %d\n", p, q, m, n);
return 0 ;

结果我想的是3和18,为什么是19呢?
p = 3
q = 3
m = 19
n = 19


福禄娃娃 发表于 2013-10-17 08:17:39

这种问题不用太纠结,一般都不会写这种代码的,由于编译器的不同,结果也不同。
经反汇编可以看出,第一题 i 先自增两次之后变成 3 ,然后 3 + 3 = 68:      printf (" %d\n ",(++i)+(++i));
0040102F   mov         eax,dword ptr
00401032   add         eax,1
00401035   mov         dword ptr ,eax
00401038   mov         ecx,dword ptr
0040103B   add         ecx,1
0040103E   mov         dword ptr ,ecx
00401041   mov         edx,dword ptr
00401044   add         edx,dword ptr
00401047   push      edx
00401048   push      offset string " %d\n " (0042201c)
0040104D   call      printf (004010a0)
00401052   add         esp,8
第二题
p = 1 + 1 +1 =3   i =4
q = 1 + 1 + 1 =3    j = 4
开始 i = 4   然后 i自增一次为6 接着6+6=12接着i自增一次为77+12=19   m = 6 + 6 + 7 = 19
开始j = 4   然后 j 自增一次为5接着 j 自增一次为66+6=12   接着 j 自增一次为77 + 12 =19
n = 6 + 6 + 7 =196:      int i = 1, j = 1, p, q, m, n;
0040D748   mov         dword ptr ,1
0040D74F   mov         dword ptr ,1
7:
8:      p = ( i++ ) + ( i++ ) + ( i++ );
0040D756   mov         eax,dword ptr
0040D759   add         eax,dword ptr
0040D75C   add         eax,dword ptr
0040D75F   mov         dword ptr ,eax
0040D762   mov         ecx,dword ptr
0040D765   add         ecx,1
0040D768   mov         dword ptr ,ecx
0040D76B   mov         edx,dword ptr
0040D76E   add         edx,1
0040D771   mov         dword ptr ,edx
0040D774   mov         eax,dword ptr
0040D777   add         eax,1
0040D77A   mov         dword ptr ,eax
9:      q =j+++j+++j++ ;
0040D77D   mov         ecx,dword ptr
0040D780   add         ecx,dword ptr
0040D783   add         ecx,dword ptr
0040D786   mov         dword ptr ,ecx
0040D789   mov         edx,dword ptr
0040D78C   add         edx,1
0040D78F   mov         dword ptr ,edx
0040D792   mov         eax,dword ptr
0040D795   add         eax,1
0040D798   mov         dword ptr ,eax
0040D79B   mov         ecx,dword ptr
0040D79E   add         ecx,1
0040D7A1   mov         dword ptr ,ecx
10:       m = ( ++i ) + ( ++i ) + ( ++i );
0040D7A4   mov         edx,dword ptr
0040D7A7   add         edx,1
0040D7AA   mov         dword ptr ,edx
0040D7AD   mov         eax,dword ptr
0040D7B0   add         eax,1
0040D7B3   mov         dword ptr ,eax
0040D7B6   mov         ecx,dword ptr
0040D7B9   add         ecx,dword ptr
0040D7BC   mov         edx,dword ptr
0040D7BF   add         edx,1
0040D7C2   mov         dword ptr ,edx
0040D7C5   add         ecx,dword ptr
0040D7C8   mov         dword ptr ,ecx
11:       n =++j+++j+++j ;
0040D7CB   mov         eax,dword ptr
0040D7CE   add         eax,1
0040D7D1   mov         dword ptr ,eax
0040D7D4   mov         ecx,dword ptr
0040D7D7   add         ecx,1
0040D7DA   mov         dword ptr ,ecx
0040D7DD   mov         edx,dword ptr
0040D7E0   add         edx,dword ptr
0040D7E3   mov         eax,dword ptr
0040D7E6   add         eax,1
0040D7E9   mov         dword ptr ,eax
0040D7EC   add         edx,dword ptr
0040D7EF   mov         dword ptr ,edx

随风听雨雪 发表于 2013-10-17 11:41:07

不用过分的纠结这个吧,在实际中没有实用价值
页: [1]
查看完整版本: 关于自增与自减的困惑