汇编分析下、VC6.0
int x = 2;
x = x++ + ++x;
// x 地址赋值
mov dword ptr [x], 2 // x = 2
// 这里把x值赋值给eax寄存器运算、最后在返回给x
mov eax,dword ptr [x]
add eax,1
mov dword ptr [x],eax // x += 1
// 把当前为3的x值赋值给ecx寄存器
mov ecx,dword ptr [x]
// x当前为3
add ecx,dword ptr [x]
// x += x
mov dword ptr [x],ecx
// 现在x=6
mov edx,dword ptr [x]
// x += 1
add edx,1
// 最终 x = 7
mov dword ptr [x],edx
本来按照正常理解 x ++ 后加、应该是 x = 2 + 3 = 5的、然后结果却是 7、按照汇编解析出的逻辑顺序如下
int x = 2;
/*
x = x++ + ++x 分解为
x = x地址 + x地址;
++x先加1了、然后上面就是 x = 3 + 3、然后在加一个后置++
大概如下:
*/
++ x;
x += x;
x ++;
上述的是在VC6编辑器上测试的、而在Java jdk8中、结果却是6、
x = x ++ + ++x; // 2 + 3、返回给x后在后置++
javap查看
int x = 2;
x = x++ + ++x;
// javap分析
iconst_2 // int x = 2;
istore_1 // 将int类型值存入局部变量1
iload_1 // 从局部变量1中装载int类型值
iinc 1, 1 // 把一个常量值加到一个int类型的局部变量上: x ++
iinc 1, 1 // x ++、此时 x = 4
iload_1
iadd // 栈顶为2、最后2+4、最终结果为6
istore_1 // 最后将值返回给栈
Original: https://www.cnblogs.com/tie-dao/p/16637099.html
Author: 鐡道
Title: 汇编分析 int x = 2; x = x++ + ++x;
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/622140/
转载文章受原作者版权保护。转载请注明原作者出处!