| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 521 人关注过本帖
标题:a++和b++
只看楼主 加入收藏
wxz11191975
Rank: 1
等 级:新手上路
帖 子:98
专家分:0
注 册:2011-6-20
结帖率:85.29%
收藏
已结贴  问题点数:5 回复次数:5 
a++和b++
#include<stdio.h>
fun(int x,int y) {return(x+y);}

int main()
{int a=1,b=2,c=3,sum;
 sum=fun((a++,b++,a+b),c++);
 printf("%d %d %d %d %d %d\n",a,a++,b,b++,a+b,sum);
     system("PAUSE");
   return 0;
}
程序运行后的结果是:3 2 4 3 5 8

不明白的是:怎么a和b分别变成了3和4的?
搜索更多相关主题的帖子: system return 
2011-08-30 17:57
xd1103121524
Rank: 2
等 级:论坛游民
帖 子:27
专家分:49
注 册:2011-8-29
收藏
得分:1 
我在电脑运行后的结果是2,2,3,3,5,8 。这个结果才是正确的。。。。你再试试吧。。
2011-08-30 18:44
zhshjia
Rank: 2
等 级:论坛游民
帖 子:16
专家分:19
注 册:2011-8-29
收藏
得分:1 
printf("%d %d %d %d %d %d\n",a,a++,b,b++,a+b,sum);是右目运算
2011-08-30 19:19
Luminal
Rank: 6Rank: 6
等 级:侠之大者
帖 子:140
专家分:470
注 册:2011-8-24
收藏
得分:1 
以下是引用wxz11191975在2011-8-30 17:57:11的发言:

#include<stdio.h>
fun(int x,int y) {return(x+y);}

int main()
{int a=1,b=2,c=3,sum;
 sum=fun((a++,b++,a+b),c++);
 printf("%d %d %d %d %d %d\n",a,a++,b,b++,a+b,sum);
     system("PAUSE");
   return 0;
}
程序运行后的结果是:3 2 4 3 5 8

不明白的是:怎么a和b分别变成了3和4的?

不同编译器结果不同!我这能这么说,我用了2个不同的编译器,得到不同的结果
3 2 4 3 7 8
2 2 3 3 5 8
建议不要深究此事,有点害人!
水平有限,注释难免有错误,请多包涵
vc6.0
 int a=1,b=2,c=3,sum;
00401068 C7 45 FC 01 00 00 00 mov         dword ptr [ebp-4],1   ;[ebp-4]相当于a,  a=1
0040106F C7 45 F8 02 00 00 00 mov         dword ptr [ebp-8],2 ;  [ebp-8]相当于b,  b=2
00401076 C7 45 F4 03 00 00 00 mov         dword ptr [ebp-0Ch],3; [ebp-0Ch]相当于c,c=3
 sum=fun((a++,b++,a+b),c++);
0040107D 8B 45 FC             mov         eax,dword ptr [ebp-4];a的值给EAX
00401080 83 C0 01             add         eax,1                ;a++
00401083 89 45 FC             mov         dword ptr [ebp-4],eax
00401086 8B 4D F8             mov         ecx,dword ptr [ebp-8]
00401089 83 C1 01             add         ecx,1               ;b++
0040108C 89 4D F8             mov         dword ptr [ebp-8],ecx
0040108F 8B 55 F4             mov         edx,dword ptr [ebp-0Ch] ;取c的值放入edx,此时c=3
00401092 89 55 EC             mov         dword ptr [ebp-14h],edx;放到地址[ebp-14h]=3,临时的
00401095 8B 45 EC             mov         eax,dword ptr [ebp-14h];数值3放入EAX
00401098 50                   push        eax                     ;压入参数y=3,
00401099 8B 4D FC             mov         ecx,dword ptr [ebp-4]   ;ecx=a=2
0040109C 03 4D F8             add         ecx,dword ptr [ebp-8]  ;eax=a+b=2+3
0040109F 51                   push        ecx                     ;压入参数x=5
004010A0 8B 55 F4             mov         edx,dword ptr [ebp-0Ch]
004010A3 83 C2 01             add         edx,1                    ;c++
004010A6 89 55 F4             mov         dword ptr [ebp-0Ch],edx  ;c=4
004010A9 E8 5C FF FF FF       call        @ILT+5(fun) (0040100a) ;fun()
004010AE 83 C4 08             add         esp,8
004010B1 89 45 F0             mov         dword ptr [ebp-10h],eax ;返回值存在sum中[ebp-10h]
执行到此a=2,b=3,c=4,sum=8
  printf("%d %d %d %d %d %d\n",a,a++,b,b++,a+b,sum);
004010B4 8B 45 F0             mov         eax,dword ptr [ebp-10h]
004010B7 50                   push        eax                    ;传参sum=8
004010B8 8B 4D FC             mov         ecx,dword ptr [ebp-4]  ;a=2放入ecx
004010BB 03 4D F8             add         ecx,dword ptr [ebp-8]  ;a+b=2+3=5
004010BE 51                   push        ecx                    ;传参a+b(5)
004010BF 8B 55 F8             mov         edx,dword ptr [ebp-8]  ;b=3
004010C2 89 55 E8             mov         dword ptr [ebp-18h],edx ;
004010C5 8B 45 E8             mov         eax,dword ptr [ebp-18h] ;eax=b=3
004010C8 50                   push        eax                     ;传参b++
004010C9 8B 4D F8             mov         ecx,dword ptr [ebp-8]   ;ecx=b=3
004010CC 51                   push        ecx                     ;传参b
004010CD 8B 55 FC             mov         edx,dword ptr [ebp-4]   ;edx=a=2
004010D0 89 55 E4             mov         dword ptr [ebp-1Ch],edx
004010D3 8B 45 E4             mov         eax,dword ptr [ebp-1Ch] ;eax=edx=a=2
004010D6 50                   push        eax                     ;传参a++;
004010D7 8B 4D FC             mov         ecx,dword ptr [ebp-4]   ecx=a=2
004010DA 51                   push        ecx                     ;传参 a
004010DB 68 1C 20 42 00       push        offset string "%d %d %d %d %d %d\n" (0042201c);取格式输出的地址
004010E0 8B 55 FC             mov         edx,dword ptr [ebp-4]  ;edx=a=2
004010E3 83 C2 01             add         edx,1                  ;此时才开始计算printf中的 a++
004010E6 89 55 FC             mov         dword ptr [ebp-4],edx  ; a=3
004010E9 8B 45 F8             mov         eax,dword ptr [ebp-8]  ;eax=b=2
004010EC 83 C0 01             add         eax,1                  ;此时才开始计算printf中的 b++
004010EF 89 45 F8             mov         dword ptr [ebp-8],eax  ;b=4
004010F2 E8 49 00 00 00       call        printf (00401140)      ;调用printf函数,输出
输出结果 2 2 3 3 5 8
004010F7 83 C4 1C             add         esp,1Ch
至此:a=3,b=4,c=4,sum=8
这里仅以vc6.0编译的作为例子说明一下,标注的不专业,希望能说明问题
如果你得到了不同的结果那就要看其汇编指令是如何实现的,也就是编译器如何处理的了
所以说,研究类似的问题,对于初学者来说有点害人的意思,哈哈,个人观点,希望大家不要较真,娱乐一下而已!

[ 本帖最后由 Luminal 于 2011-8-30 19:32 编辑 ]
收到的鲜花
  • TonyDeng2011-08-30 20:31 送鲜花  10朵   附言:想不到你还有汇编基础
2011-08-30 19:30
lin471306489
Rank: 4
等 级:业余侠客
帖 子:136
专家分:247
注 册:2011-8-16
收藏
得分:1 
编译器不同不同结果
2011-08-30 20:23
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:1 
跟我之前问过的问题一样,都属于C中的未定义行为。书中给的建议是:不要在使用变量的表达式中改变变量的值,不要在传递多个函数参数的同时改变参数的值。

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2011-08-30 21:18
快速回复:a++和b++
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023359 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved