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
求解释~
语句的具体执行过程是什么样的?还有以上的一些问题
求高手解答!!!
这依赖于实现。所以分析结果只对特定编译环境有意义。
++i,和 i++ 等级一样,优先与+=。即 单目运算高于赋值运算。
个人理解: 先执行 ++i,运算之前,变量先完成自增,i变为2,
再执行 i++, 变量参加表达式的运算后再自增,此时 i不变,扔为2,并 保留自增操作。
接着执行+=,俩边都是i,此时都是2,得到结果4。
最后执行保留的自增操作,变为5.
PS:1、没太看懂你要问的问题。
2、本人用C#开发,C/C++和汇编还给老师了。
3、从研究和学习的角度,可以理解下这样的代码;但在实际工作中,这样的代码是要不得的。
那这样的话,就是说复合赋值操作的执行顺序是从左到右的?
i= 1,
++i; //i=2
i+=i; // i = 4
i++; // i = 5
请问右自增操作是在所在语句结束后才完成的?
还有复合赋值操作中操作数的执行顺序是从左往右的?
@leowww: 左增操作符优先级最高, 右增最低。
我觉得楼上及楼上的楼上说的很对,学习了。
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
我是老板的话,谁敢写这种代码,就开除谁!
说的很对~
语句具有二义性,结果未定义
++i+=i++;
执行顺序等价于:
这样的代码连学习都不配,建议不要看这种代码,毫无意义!估计你是在校学生吧。实际程序中不会出现这个晦涩的代码的!
最讨厌这种题了,特别是笔试中遇到。。。