一个小问题,求指导
#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”的值是如何算的?
i++是先取i的值再++
++i是先++再取id值 先算括号,至于自增去看视频吧 千寻0 发表于 2014-8-18 19:22
i++是先取i的值再++
++i是先++再取id值
恩,我算出来的是p=5+6+7=18,q=6+7+8=21,一个都没对上呢 瞳羽 发表于 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的区别就是不要把他们写在一个含多个表达式的运算表达式里面
可移植性不强,只把他作为一条语句使用就行 千寻0 发表于 2014-8-21 10:55
i++,编译器是先将i的值放到一个寄存器里面,然后计算的结果给p,寄存器再执行++过程,
++j是先把前两个+ ...
谢谢,我学完C语言就学汇编
页:
[1]