寻C语言高手。。。
,为什么结果是,谢谢。
追问:の。。。高深,能通俗点么。。。
,为什么结果是,谢谢。
追问:の。。。高深,能通俗点么。。。
答案:在VC++6.0的菜单项view->Debug Windows->Disassembly(或Alt+8)可在反汇编窗口中看到C语言对应的汇编语言程序,如下:
在这里,可以看到,x的存储单元是[ebp-4],y的存储单元是[ebp-8]5: y=++x+(++x)+(++x);
0040102F mov eax,dword ptr [ebp-4] 前三步实现的是上式中最右边的括号中的操作(++x)
00401032 add eax,1
00401035 mov dword ptr [ebp-4],eax 此时,x=4
00401038 mov ecx,dword ptr [ebp-4] 接着三步实现的是上式中中间的括号中的操作(++x)
0040103B add ecx,1
0040103E mov dword ptr [ebp-4],ecx 此时,x=5
00401041 mov edx,dword ptr [ebp-4] 这一步取出x放在edx寄存器中
00401044 add edx,dword ptr [ebp-4] 这一步实现x与x的相加,也就是后两步(++x)+(++x),此时dx中放着这个计算结果10
00401047 mov eax,dword ptr [ebp-4] 接着三步实现的是上式中最左边的++x
0040104A add eax,1
0040104D mov dword ptr [ebp-4],eax 此时,x=6
00401050 add edx,dword ptr [ebp-4] 拿dx的值也就是(++x)+(++x)与最左边的++x的结果x=6相加得16
00401053 mov dword ptr [ebp-8],edx 把最终的计算结果dx放在y的存储单元,y=16
这样,x=6,y=16我想应该是这样的
y=++x 这里没括号,系统会识别计算方式为 y=(++x)+(++x),++x
所以y=4+4+4+4=16
至于X 也是根据 ++x 来算的
x=+x
不知道正确 不呵呵
x自加了三次,所以x=6;
首先++x,此时x=4,然后再++x,此时x=5,加法只要两个参数就可以,所以此时会运算得到一个结果10,此值暂存在某处,然后++x,此时x=6,加法又满足了两个参数,10+6=16
结果应该是x=6,y=18吧?
int x=3,y;
y=++x+(++x)+(++x)
x=6为什么?
因为x=3 有三个++ 。
第一个++完成后x=4
第二个++注意就是5了,
第三个++注意就是6了,x=6了。
再输出时(x=6)了
++x //在用之前x=x+1 如 x=3;y=x++;y=y+10 printf("%d",y) 结果为:13
如 x=3;y=++x;y=y+10 printf("%d",y) 结果为 :14
x++ //用完之后x=x+1 如上面说的
注意:如x=3; printf("%d,%d",x,x++) 和 printf("%d,%d",x++,x)是有区别的,前者是3,3后者是3,4);
y=16这与编译器有关,结果不唯一,但有个ANSI标准
有的编译器处理是 x=3;y=++x+(++x)+(++x) 先让x++全部加完为6 相当于++x;++x;++x; 然后全部相加哦18
你的y=16的结果可能是编译器的问题,(但是那也是4+5+6=15)为了使程序更清晰不要使用多层++--的。可读性很差,若你是熟练高手那就完全没问题了。 本程序Turbo c/c++ 3.0验证过
这可能是和系统有关系吧。我运行这个程序没有错误,x=6,y=18,
也就是说x先自加3次,然后3个x相加。