i=i++到底是怎么执行的

来源:互联网 发布:攀枝花学院知乎 编辑:程序博客网 时间:2024/06/03 17:44

i=i++,在不同的语言中的执行应该是一样的,即:

temp = i;i++;i = temp;

把程序反编译可以看出汇编语句的执行步骤:

反编译

先把i的值存到eax寄存器,eax的值再赋给ecx,然后ecx自增,ecx自增后赋值给变量i,最后eax的值赋给变量i把自增覆盖掉

有人说C++的执行会不一样,我用visual 6.0测试了一下,果然:

visual

但是,这只是在visual 下编译运行的情况,同一段程序,换个编译器,结果又不一样了:

novisual

那么i=i++到底怎么执行呢?

测试过几个不同的平台,C,C++,OC,JAVA等多种语言,mac,win,linux,多种环境,大部分编译器都是 temp = i;i++;i = temp; 这种结果,除了visual。在很多编译器编译i=i++的时候会报一个multiple unsequenced modifications to 'i'的警告。

i=i++这种写法很不便于理解,也容易产生歧义,如果写自增,就单独一条语句i++,如果要赋值,尽量用j = i++这种语句。代码结构要清晰,应尽量避免写出容易让人误解的代码。