首页 新闻 会员 周边

C++中一个简单又复杂的问题:++i+=i++

0
悬赏园豆:20 [已解决问题] 解决于 2013-10-17 19:06

i=1;

++i+=i++;

执行完后i=5!

 

问题关键:

1、复合赋值操作++i只做了一次左操作数

2、i++执行完后返回i原值的副本,在一条语句结束后才完成自增?

3、复合赋值赋值操作的执行顺序是什么样的?先右后左还是根据编译器而异?

 

vs中的反汇编代码:

    (++i)+=i++;
00CC14F0  mov         eax,dword ptr [i]  
00CC14F3  add         eax,1  
00CC14F6  mov         dword ptr [i],eax  
00CC14F9  mov         ecx,dword ptr [i]  
00CC14FC  add         ecx,dword ptr [i]  
00CC14FF  mov         dword ptr [i],ecx  
00CC1502  mov         edx,dword ptr [i]  
00CC1505  add         edx,1  
00CC1508  mov         dword ptr [i],edx 

求解释~

 

语句的具体执行过程是什么样的?还有以上的一些问题

求高手解答!!!

c++
leowww的主页 leowww | 初学一级 | 园豆:127
提问于:2013-06-24 19:34
< >
分享
最佳答案
0

这依赖于实现。所以分析结果只对特定编译环境有意义。

收获园豆:15
hoodlum1980 | 小虾三级 |园豆:559 | 2013-10-07 14:55
其他回答(9)
0

++i,和 i++ 等级一样,优先与+=。即 单目运算高于赋值运算。

个人理解: 先执行 ++i,运算之前,变量先完成自增,i变为2,

               再执行 i++, 变量参加表达式的运算后再自增,此时 i不变,扔为2,并 保留自增操作。

               接着执行+=,俩边都是i,此时都是2,得到结果4。

              最后执行保留的自增操作,变为5.

PS:1、没太看懂你要问的问题。

       2、本人用C#开发,C/C++和汇编还给老师了。

       3、从研究和学习的角度,可以理解下这样的代码;但在实际工作中,这样的代码是要不得的。

收获园豆:5
北落师门α | 园豆:17 (初学一级) | 2013-06-24 22:26

那这样的话,就是说复合赋值操作的执行顺序是从左到右的?

支持(0) 反对(0) leowww | 园豆:127 (初学一级) | 2013-06-25 13:54
0

i= 1,

++i;  //i=2

i+=i;  // i = 4

i++;  // i = 5

gunsmoke | 园豆:3592 (老鸟四级) | 2013-06-25 05:42

请问右自增操作是在所在语句结束后才完成的?

还有复合赋值操作中操作数的执行顺序是从左往右的?

支持(0) 反对(0) leowww | 园豆:127 (初学一级) | 2013-06-25 13:56

@leowww: 左增操作符优先级最高, 右增最低。

支持(0) 反对(0) gunsmoke | 园豆:3592 (老鸟四级) | 2013-06-27 09:11
0

我觉得楼上及楼上的楼上说的很对,学习了。

程小白 | 园豆:9 (初学一级) | 2013-06-25 13:29
0

00CC14F0  mov         eax,dword ptr [i]    ;eax =1
00CC14F3  add         eax,1                     ;eax =2
00CC14F6  mov         dword ptr [i],eax    ;dword ptr[i] = eax = 2
00CC14F9  mov         ecx,dword ptr [i]    ; ecx = 2
00CC14FC  add         ecx,dword ptr [i]     ;ecx = 4;
00CC14FF  mov         dword ptr [i],ecx    ; dword ptr[i] = 4;
00CC1502  mov         edx,dword ptr [i]   ; edx = 4;
00CC1505  add         edx,1                    ; edx = 5
00CC1508  mov         dword ptr [i],edx   ; dword ptr[i] =5

薛遗山 | 园豆:106 (初学一级) | 2013-07-18 14:49
0

我是老板的话,谁敢写这种代码,就开除谁!

地质灾害 | 园豆:262 (菜鸟二级) | 2013-07-24 19:46

说的很对~

支持(0) 反对(0) 风雨杳如年 | 园豆:200 (初学一级) | 2013-09-02 19:39
0

语句具有二义性,结果未定义

蚯蚓饮泉 | 园豆:202 (菜鸟二级) | 2013-07-31 14:56
0

++i+=i++;

执行顺序等价于:

  1. ++i; //i = 2
  2. i += i ; //i = 4
  3. i++; // i = 5
猿人谷 | 园豆:215 (菜鸟二级) | 2013-08-31 16:40
0

这样的代码连学习都不配,建议不要看这种代码,毫无意义!估计你是在校学生吧。实际程序中不会出现这个晦涩的代码的!

Jeremy123 | 园豆:204 (菜鸟二级) | 2013-09-12 23:05
0

最讨厌这种题了,特别是笔试中遇到。。。

18fanna | 园豆:210 (菜鸟二级) | 2013-10-06 22:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册