瞳羽 发表于 2014-8-18 11:09:11

一个小问题,求指导

#include<stdio.h>
void main()
{
   int i=5,j=5,p=0,q=0;
   p=(i++)+(i++)+(i++);
   q=(++j)+(++j)+(++j);
   printf("%d,%d,%d,%d\n",p,q,i,j);

}

代码如上,执行结果为:15,22,8,8

请问“P”和“q”的值是如何算的?

千寻0 发表于 2014-8-18 19:22:56

i++是先取i的值再++
++i是先++再取id值

♂情︵☆缘★ 发表于 2014-8-18 21:01:26

先算括号,至于自增去看视频吧

瞳羽 发表于 2014-8-20 08:53:37

千寻0 发表于 2014-8-18 19:22
i++是先取i的值再++
++i是先++再取id值

恩,我算出来的是p=5+6+7=18,q=6+7+8=21,一个都没对上呢

千寻0 发表于 2014-8-21 10:55:30

瞳羽 发表于 2014-8-20 08:53
恩,我算出来的是p=5+6+7=18,q=6+7+8=21,一个都没对上呢

i++,编译器是先将i的值放到一个寄存器里面,然后计算的结果给p,寄存器再执行++过程,
++j是先把前两个++算出来然后再得知和后面的算
5:       int i=5,j=5,p=0,q=0;
00401028   mov         dword ptr ,5
0040102F   mov         dword ptr ,5
00401036   mov         dword ptr ,0
0040103D   mov         dword ptr ,0
6:       p=(i++)+(i++)+(i++);
00401044   mov         eax,dword ptr
00401047   add         eax,dword ptr
0040104A   add         eax,dword ptr
0040104D   mov         dword ptr ,eax
00401050   mov         ecx,dword ptr
00401053   add         ecx,1
00401056   mov         dword ptr ,ecx
00401059   mov         edx,dword ptr
0040105C   add         edx,1
0040105F   mov         dword ptr ,edx
00401062   mov         eax,dword ptr
00401065   add         eax,1
00401068   mov         dword ptr ,eax
7:       q=(++j)+(++j)+(++j);
0040106B   mov         ecx,dword ptr
0040106E   add         ecx,1
00401071   mov         dword ptr ,ecx
00401074   mov         edx,dword ptr
00401077   add         edx,1
0040107A   mov         dword ptr ,edx
0040107D   mov         eax,dword ptr
00401080   add         eax,dword ptr
00401083   mov         ecx,dword ptr
00401086   add         ecx,1
00401089   mov         dword ptr ,ecx
0040108C   add         eax,dword ptr
0040108F   mov         dword ptr ,eax

你要学会看反汇编
这个问题是编译器的问题,不同机器运行结果可能不一样,这个问题没有必要深究
在编写程序的时候一般不要去用i++和++i的区别就是不要把他们写在一个含多个表达式的运算表达式里面
可移植性不强,只把他作为一条语句使用就行

瞳羽 发表于 2014-8-22 09:59:45

千寻0 发表于 2014-8-21 10:55
i++,编译器是先将i的值放到一个寄存器里面,然后计算的结果给p,寄存器再执行++过程,
++j是先把前两个+ ...

谢谢,我学完C语言就学汇编
页: [1]
查看完整版本: 一个小问题,求指导