注册 登录
编程论坛 数据结构与算法

(X++)+(X++)+(++x)怎么算这个表达式的值啊??

爱德华 发布于 2011-09-09 15:11, 714 次点击
  当  x=1   时,
(x++)+(x++)+(x++)怎么算这个表达式的值啊?
求详细的分析及过程。
8 回复
#2
zhcosin2011-09-09 17:55
有必要把一个程序写得如此矫揉造作吗?编程的时候完全可以避免这种容易混淆的写法。
#3
laznrbfe2011-09-09 19:46
程序代码:
#include<stdio.h>
void main()
{
    int x1=1,x2=1;
    int s1,s2;
    s1=(x1++)+(x1++)+(x1++);
    printf("x1=%d\n",x1);
    s2=(++x2)+(++x2)+(++x2);
    printf("x2=%d\n",x2);
    printf("s1=%d,s2=%d\n",s1,s2);
}
x1=4
x2=4
s1=3,s2=10

执行s1=(x1++)+(x1++)+(x1++);时,x1++是先运算,后加1,即:s1=x1+x1+x1;x1=x1++;x1=x1++;x1=x1++;
执行s2=(++x2)+(++x2)+(++x2);时,x2++是先加1,再运算。即:x2=++x2;x2=++x2;s2=x2+(++x2);
我是这样理解的。
#4
waterstar2011-09-10 10:03
把这个问题移到c语言编程模块去
#5
yuccn2011-09-10 14:14
void main()
{
00412050  push        ebp  
00412051  mov         ebp,esp
00412053  sub         esp,0F0h
00412059  push        ebx  
0041205A  push        esi  
0041205B  push        edi  
0041205C  lea         edi,[ebp-0F0h]
00412062  mov         ecx,3Ch
00412067  mov         eax,0CCCCCCCCh
0041206C  rep stos    dword ptr es:[edi]
    int x1=1,x2=1;
0041206E  mov         dword ptr [x1],1
00412075  mov         dword ptr [x2],1
    int s1,s2;
    s1=(x1++)+(x1++)+(x1++);
0041207C  mov         eax,dword ptr [x1]
0041207F  add         eax,dword ptr [x1]
00412082  add         eax,dword ptr [x1]
00412085  mov         dword ptr [s1],eax
00412088  mov         ecx,dword ptr [x1]
0041208B  add         ecx,1
0041208E  mov         dword ptr [x1],ecx
00412091  mov         edx,dword ptr [x1]
00412094  add         edx,1
00412097  mov         dword ptr [x1],edx
0041209A  mov         eax,dword ptr [x1]
0041209D  add         eax,1
004120A0  mov         dword ptr [x1],eax
    printf("x1=%d\n",x1);
004120A3  mov         esi,esp
004120A5  mov         eax,dword ptr [x1]
004120A8  push        eax  
004120A9  push        offset string "x1=%d\n" (416660h)
004120AE  call        dword ptr [__imp__printf (4192F0h)]
004120B4  add         esp,8
004120B7  cmp         esi,esp
004120B9  call        @ILT+355(__RTC_CheckEsp) (411168h)
    s2=(++x2)+(++x2)+(++x2);
004120BE  mov         eax,dword ptr [x2]
004120C1  add         eax,1
004120C4  mov         dword ptr [x2],eax
004120C7  mov         ecx,dword ptr [x2]
004120CA  add         ecx,1
004120CD  mov         dword ptr [x2],ecx
004120D0  mov         edx,dword ptr [x2]
004120D3  add         edx,1
004120D6  mov         dword ptr [x2],edx
004120D9  mov         eax,dword ptr [x2]
004120DC  add         eax,dword ptr [x2]
004120DF  add         eax,dword ptr [x2]
004120E2  mov         dword ptr [s2],eax
    printf("x2=%d\n",x2);
004120E5  mov         esi,esp
004120E7  mov         eax,dword ptr [x2]
004120EA  push        eax  
004120EB  push        offset string "x2=%d\n" (416658h)
004120F0  call        dword ptr [__imp__printf (4192F0h)]
004120F6  add         esp,8
004120F9  cmp         esi,esp
004120FB  call        @ILT+355(__RTC_CheckEsp) (411168h)
    printf("s1=%d,s2=%d\n",s1,s2);

如果你能看懂汇编 就立即了。。这个是反汇编出来的。
#6
yuccn2011-09-10 14:19
    s1=(x1++)+(x1++)+(x1++);
0041207C  mov         eax,dword ptr [x1]
0041207F  add         eax,dword ptr [x1]
00412082  add         eax,dword ptr [x1]
00412085  mov         dword ptr [s1],eax
00412088  mov         ecx,dword ptr [x1]
0041208B  add         ecx,1
0041208E  mov         dword ptr [x1],ecx
00412091  mov         edx,dword ptr [x1]
00412094  add         edx,1
00412097  mov         dword ptr [x1],edx
0041209A  mov         eax,dword ptr [x1]
0041209D  add         eax,1
004120A0  mov         dword ptr [x1],eax
也就是 s = x1+x1+x1 = 3;
x1++;x1++;x1++;//

s1=(x1++)+(x1++)+(x1++); // s1=3,x1=4;


    s2=(++x2)+(++x2)+(++x2);
004120BE  mov         eax,dword ptr [x2]
004120C1  add         eax,1
004120C4  mov         dword ptr [x2],eax
004120C7  mov         ecx,dword ptr [x2]
004120CA  add         ecx,1
004120CD  mov         dword ptr [x2],ecx
004120D0  mov         edx,dword ptr [x2]
004120D3  add         edx,1
004120D6  mov         dword ptr [x2],edx
004120D9  mov         eax,dword ptr [x2]
004120DC  add         eax,dword ptr [x2]
004120DF  add         eax,dword ptr [x2]
004120E2  mov         dword ptr [s2],eax

也就是x2=x2+1;x2=x2+1;x2=x2+1; s2=x2+x2+x2。这时候,x2=4.s2=12.。

#7
爱德华2011-09-16 22:24
回复 2楼 zhcosin
不是我想搞得更清楚点吗.
#8
omijialang2011-09-17 16:33
发生未定义行为吧(c语言不确定这样做的结果)   应该是。(好像听老师说过)
#9
艹蛋灬爱情2011-10-25 16:30
放到编程软件上运行一下
1