鱼C论坛

 找回密码
 立即注册
查看: 4618|回复: 6

自增自减不过关求原因

[复制链接]
发表于 2013-1-1 05:08:38 | 显示全部楼层 |阅读模式
2鱼币
# include <stdio.h>
int wo(int a , int b)
{
int c;
c=a+b;
return c;
}
int main(void)
{
int x=6,y=7,z=8,r;
r=wo((--x,y++,x+y),--z);// z-- 出错
printf("%d\n",r);
return 0;
}
/*
为什么 z-- 运行的结果是21
而改成 --z 运行的结果是20
*/

最佳答案

查看完整内容

简单点讲就是x=6,y=7,z=8,r; 操作是这样的首先--x=5 y++=8 x+y=13 然后传入参数13 也就是你子程序中的形参a --z=7 传入参数7 也就是子程序的形参b 然后进入你的子程序 c=a+b=13+7=20 这就是结果 11: r=wo((--x,y++,x+y),--z);// z-- 出错 0040FA3D mov eax,dword ptr [ebp-4];EAX赋值为变量x 0040FA40 sub eax,1;EAX减一 0040FA43 mov dword ptr [ebp-4],eax;赋值给变量 ...
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-1-1 05:08:39 | 显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2013-1-1 14:59 编辑

简单点讲就是x=6,y=7,z=8,r;
操作是这样的首先--x=5
y++=8

x+y=13
然后传入参数13
也就是你子程序中的形参a
--z=7
传入参数7
也就是子程序的形参b
然后进入你的子程序
c=a+b=13+7=20
这就是结果


11:       r=wo((--x,y++,x+y),--z);// z-- 出错
0040FA3D   mov         eax,dword ptr [ebp-4];EAX赋值为变量x
0040FA40   sub         eax,1;EAX减一
0040FA43   mov         dword ptr [ebp-4],eax;赋值给变量X,这上面三句对应--x
0040FA46   mov         ecx,dword ptr [ebp-8];ecx赋值变量y
0040FA49   add         ecx,1;ecx加一
0040FA4C   mov         dword ptr [ebp-8],ecx;赋值给变量y,这上面三句对应y++
0040FA4F   mov         edx,dword ptr [ebp-0Ch];edx赋值变量z
0040FA52   sub         edx,1;EDX自减1
0040FA55   mov         dword ptr [ebp-0Ch],edx;EDX赋值给变量Z,对应的是--z
0040FA58   mov         eax,dword ptr [ebp-0Ch];eax赋值为Z变量
0040FA5B   push        eax;传入参数Z
0040FA5C   mov         ecx,dword ptr [ebp-4];ecx赋值为变量X
0040FA5F   add         ecx,dword ptr [ebp-8];ECX加上变量Y,对应X+Y
0040FA62   push        ecx;传入参数
0040FA63   call        @ILT+5(_wo) (0040100a);CALL你的子程序
0040FA68   add         esp,8;平衡栈
0040FA6B   mov         dword ptr [ebp-10h],eax;return c 结果为20


至于为什么Z--的结果为21
因为编译器是这样操作的
你是Z--,意思就是Z先参加其他运算后再进行自减
也就是前面的照样结果为13
后面你传的参数Z先不要自减
先进入子程序,等计算完后也就是结果为21时return后自减

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-1-1 10:05:03 | 显示全部楼层
这种问题我从来不研究,编程的时候根本用不到。就算用到也要小心,同样代码在不同编译器下,可能结果不一样的

点评

说得非常好!  发表于 2013-1-1 10:09

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
仰望天上的光 + 2 + 2 + 2

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-1-1 13:19:01 | 显示全部楼层
本帖最后由 kily610 于 2013-1-1 13:48 编辑

z--  是后自减  后自减整体表达式的值是 z-1 之前的值
--z  是前自减  前自减整体表达式的值是 z-1 之后的值  
[r=wo((--x,y++,x+y),--z);// z-- 出错]
     (--x,y++,x+y) 逗号表达式从左往右执行,逗号(也称顺序点)执行完之后--x的值就一定会减1,
     y++也一样,最终取最后一项的值..所以 x+y=13 (5+8=13)
     --z当执行到这一步的时候,--z传进函数形参的值是7(z-1 之后的值),所以结果为20;
     z--当执行到这一步的时候,--z传进函数形参的值是8(z-1 之前的值),所以结果为21;

你自己再调试下吧,看看明白没有!
我们编程时应该尽量屏蔽掉前自减和后自减的差别.
祝楼主学习愉快!!


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-1-1 23:44:38 From FishC Mobile | 显示全部楼层
luyikesita 发表于 2013-1-1 10:05
这种问题我从来不研究,编程的时候根本用不到。就算用到也要小心,同样代码在不同编译器下,可能结果不一样 ...

非常感谢您的回答,虽然是用不到,但起码也知道个原因,这题作业出得非常好>.<
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-1-1 23:47:15 From FishC Mobile | 显示全部楼层
kily610 发表于 2013-1-1 13:19
z--  是后自减  后自减整体表达式的值是 z-1 之前的值
--z  是前自减  前自减整体表达式的值是 z-1 之后的 ...

看明白了,非常感谢您的回答。你的题目例得很清楚,易懂通俗。可惜分只能给一个人,你也加油
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-1-2 18:13:07 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-9 20:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表