仰望星空的天台

0%

关于i++在不同语言中的解析问题

++i+i++

今天在知乎上看到了一个问题

int i = 0;
i = ++i+i++;

printf("%d",i);

通过Vc6.0编译执行出来的 i == 3

shootpic

但是我使用了js试了试

shootpic

shootpic

var i = 0;
i = ++i+i++;

console.log(i);

执行出来的是 i == 2

然后又试了试javaJDK8

shootpic

int i = 0;
i = ++i+i++;

System.out.println(i);

执行出来的也是 i == 2

觉得挺奇怪的于是去查了一下

原来这和Js 和 java底层解析有关

一开始Js、java和C都相同都是根据二目运算符, 从左到右(一目运算符从右到左进行运算)

int i = 0;
++i // 这时候 i == 1

但是对于i++,C和java还有javascript解析就不一样了

对于Js和javai++会先在内存中开辟一个临时空间,然后把i++一开始的值赋值给临时空间,然后进行i的自加 最后返回临时空间里面的值

i++ //先自加 这时候i == 2 然后把临时空间的值返回,返回值是临时空间的1

这样的话 在(++i) + (i++) 之前 i已经等于2了,然后1+1 再次赋值给i 所以最后得到的是2

但是C却不一样

i++ // 这时候 i++直接返回1

然后(++i) + (i++) 得到2

之后再进行i++,所以最后得到i == 3

Summery

总的来说,C对i++的解析是,当本行的代码执行完后,再在下一行执行i的自增,java和js是在本行代码中就执行了自增,所以才出现了不同。

感谢

java 中 i=i++ 的解释

Table of Contents