# re: Java中的++操作 回复 更多评论
2007-09-20 17:39 by
千里兄过奖了
顺便补充一下,刚才我研究了JavaScript和C语言中的类似情况,发现JavaScript的结果与刚才讲的Java代码结果相同,但是C语言代码有明显不同的结果;
比如这段代码:
int i=1;
int t=(4+(i++));
执行完成之后,t的值为5,i的值为2;这个结果一点也不出乎意料
但是稍加改写
int i=1;
i=(4+(i++));
执行完成之后,i的值变成了6;如果这段交给Java虚拟机运行,如上面所示,结果是5;
所以,我的想法是,C语言中的++(位于操作数右边)在整条用分号结束的语句结束之后运行;相当于在该语句之后单独写一条i++语句。
# re: Java中的++操作 回复 更多评论
2007-09-20 17:46 by
i=(4+(i++)); 这种写法会让人不知所然,既然i++了,又赋给i
# re: Java中的++操作 回复 更多评论
2007-09-20 17:52 by
如果要看i=(4+(i++));在C++中执行就反汇编出来看看
7: int i=1;
00401798 mov dword ptr [ebp-4],1
8: i=(4+(i++));
0040179F mov eax,dword ptr [ebp-4]
004017A2 add eax,4
004017A5 mov dword ptr [ebp-4],eax
004017A8 mov ecx,dword ptr [ebp-4]
004017AB add ecx,1
004017AE mov dword ptr [ebp-4],ecx
# re: Java中的++操作 回复 更多评论
2007-09-20 17:52 by
再进一步,考虑:
i=1;
i=(4+(i++)+(i++));
C语言的运行结果为8,Java和JavaScript的结果为7.
印证了我刚才对于C语言机制的想法,即++操作在整条语句之后执行;相加的值为(4+1+1)
在Java和JavaScript中,第二次load i的值时,++操作已经被执行过一次了,所以相加的值为(4+1+2)
# re: Java中的++操作 回复 更多评论
2007-09-20 17:57 by
谢谢Unmi,看来在C语言中,++确实在最后执行,这与Java和JavaScript非常不一样。后者的++在表达式走出作用域的时候就执行,而不会等到整个语句结束。
# re: Java中的++操作 回复 更多评论
2007-09-20 18:02 by
二楼的实验也非常有意义。没想到c和java在这一点上还有区别,呵呵,学到了。不过有一点不太同意二楼说的,我觉得在c里面应该是 i=i++;和i=(i++);的区别,前者不会加1,后者会,而java中这两者是一样的。我说的仅仅是猜测,并没有实验过,说错了见谅
# re: Java中的++操作 回复 更多评论
2007-09-20 18:48 by
teasp 说的二楼是我吗? 偶是楼主的说:)
我刚看了
执行下面两句
1: i=i++;
2: i=(i++);
在C中,执行完成之后,i的值均为2
在Java和JavaScript中,均为1
# re: Java中的++操作 回复 更多评论
2007-09-20 19:09 by
总结一下,这样写
i=(4+(++i));
完全是给自己制造麻烦,代码不规范
极端一些,如果你碰到面试问你
int a=1;
int b=1;
int c= a++*b+++a++b;
你会去做这种题吗?
我会转身走人
# re: Java中的++操作 回复 更多评论
2007-09-21 01:17 by
a++和++a是不同的,在java中本來就有分,一個是先把值return出去再自加,一個是自加後才return,因為你的寫法是a++,所以先return的值是1,再和4相加就是5且又指給a,這樣後來的a自加就沒有用了
# re: Java中的++操作 回复 更多评论
2007-09-21 09:31 by
是符合语义的。++操作的优先级本来就大于加号,所以一直不用写括号,写括号只是为了可读性@dc
# re: Java中的++操作 回复 更多评论
2007-09-21 09:32 by
是的,Java和JavaScript是这样的,但是你看前面的评论,C语言中,a++在整个语句(用分号结束的语句)结束之后才执行。这是关键。@piaoyi
# re: Java中的++操作 回复 更多评论
2007-09-21 10:48 by
研究的挺多,激发了我的研究热情,XX(谢谢)楼上各位!