关于x += x++的分析
关于x += x++的分析
C
源程序:
#include <stdio.h>
int main() {
int x = 1;
x += x++;
printf("%d\n", x);
return 0;
}
程序运行结果:3
gcc test.c,拖入IDA进行分析。
汇编代码:
mov [esp+20h+var_4], 1
mov eax, [esp+20h+var_4]
lea edx, [eax+1]
mov [esp+20h+var_4], edx
add [esp+20h+var_4], eax
mov eax, [esp+20h+var_4]
mov [esp+20h+var_1C], eax
mov [esp+20h+Format], offset Format ; "%d\n"
call _printf
leave
retn
分析:
(esp+20h+var_4)
即为x
x置1
eax存x的备份
将edx置为eax + 1(即为2,x++的结果)
将edx放回x
x += eax
将x送入eax进行输出
所以x += x++就变成了:
x1 = x++;
x += x1;
即先做了 x++
操作,返回了1,然后再进行 x += 1
操作。
为什么会这样呢?
因为运算符优先级中, ++
远大于 +=
。
Java
public class test {
public static void main(String[] args) {
int x = 1;
x += x++;
}
}
程序运行结果:2
javac test.java
然后 javap -c test
汇编代码:
0: iconst_1
1: istore_1
2: iload_1
3: iload_1
4: iinc 1, 1
7: iadd
8: istore_1
9: return
分析:
- 0: push 1
- 1: pop x
- 2: push x
- 3: push x
- 4: x++
- 7: 弹出两数,相加后压入
- 8: pop x
因此,x++的结果并没有被使用。
值得一提的是,在IDEA中,代码会有以下提示:
The value changed at 'x++' is never used
可见,一个优秀的IDE对于程序猿来说是很有必要的。
最后,感谢一下某学员