i++与赋值操作问题

wqxtt 2001-06-19 01:39:00
int i =0;
i=++i;
System.out.println(i);
这段代码运行结果怎么是0,不是1?
是不是java的赋值操作有什么特别的地方?
...全文
266 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
luodi 2001-06-21
  • 打赏
  • 举报
回复
在Java 中表达式的运算次序在语言规范里已经定义好了,所有平台上的JVM都应该是一样的,不存在二义性。
但是在C/C++中,由于ANSI C并没有规定必须遵守的运算次序,因此这个运算的结果要取决于编译器的具体实现了。
zhuzhichao 2001-06-20
  • 打赏
  • 举报
回复
這樣肯定是0;
因為i++是0
所以i = i++後
i是0
chen0712 2001-06-20
  • 打赏
  • 举报
回复
肯定呀!!i=i++表示将i的初始值赋0给i后,i自身再加1,所以print出来的是0而不是1,如果下次使用i这个变量时,它的值才会是1。

sfireball 2001-06-20
  • 打赏
  • 举报
回复
真正的过程是这样的
分为两部分
evaluate 从左到右 i evalute 为0 然后 i++ evaluate 为0
assignment从右往左 i= (i++ evaluate 出来的值 也就是 0)
Dureek 2001-06-19
  • 打赏
  • 举报
回复
顺便说一句, 由于运算顺序的问题, 在C中的结果是1 :)
Dureek 2001-06-19
  • 打赏
  • 举报
回复
比如这样一个class:
public class test {
public static void main(String[] args) {
int a = 5;
a = a++;
System.out.println(a);
}
}

用javap来看看(编译后javap -c test):
(略去前面一些与此关系不大的部分)
0 iconst_5 // 常数5压入堆栈中
1 istore_1 // 从堆栈中弹出赋值给索引为1的变量(这个时候a=5)
2 iload_1 // *将后面那个a(索引为1的变量)的值压入堆栈中(为了以后的赋值)
3 iinc 1 1 // 执行a++, 此时堆栈无任何变化!(这个时候a=6)
6 istore_1 // 从堆栈中弹出赋值给a(这个时候a变成了5)

// 下面就不用看了, 呵呵 ...
7 getstatic #2 <Field java.io.PrintStream out>
10 iload_1
11 invokevirtual #3 <Method void println(int)>
14 return

值得注意的是上面打星号的那一行, 我想我还得举个例子来说明:
事实上, a = a++中, 赋值给a永远都是最后一步, 而并非想象的a=a, 然后再a++ ... 为了描述上的方便, 做一下替换, 变成a=i++, 执行的过程如下:
先把i压入堆栈中, 然后i++(i的值增加了1), 接着把i从堆栈中弹出赋给了a ...
把这里的i换成a=a++中后面的那个a, 再结合上面javap提供的信息来看就应该能明白是怎么回事了, 呵呵 ...

Good luck :)
niuji 2001-06-19
  • 打赏
  • 举报
回复
i++先使用i再将i加一
++i相反
wqxtt 2001-06-19
  • 打赏
  • 举报
回复
加1操作的对象不也是i吗??
llgg008 2001-06-19
  • 打赏
  • 举报
回复
服了你了!下回弄明白了再问嘛!同意楼上的兄弟:i=i++是先赋值再加1,i=++i是先加1后赋值。
hexiaofeng 2001-06-19
  • 打赏
  • 举报
回复
i=0
i=i++
i=0

i=0
i=++i
i=1
ender 2001-06-19
  • 打赏
  • 举报
回复
:)

(i=i)++
i=(i++)
Anreddy 2001-06-19
  • 打赏
  • 举报
回复
result is 1,not zero.
if i=i++; the result is 0;
because the operation direction is from left to right.
wqxtt 2001-06-19
  • 打赏
  • 举报
回复
不好意思,写错了。应该是i=i++,呵呵。。
各位再试试
lelf2000 2001-06-19
  • 打赏
  • 举报
回复
我出来的是1
sfireball 2001-06-19
  • 打赏
  • 举报
回复
是1
airhorse 2001-06-19
  • 打赏
  • 举报
回复

这样都行,真有你的,

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧