一个简单奇怪的问题,百思不得其解!

Northwindrocker 2003-08-27 09:27:39

int i = 0;
i = i++;
System.out.println(i);


告诉我结果!嘿嘿
0
谁能解释WHY?
...全文
20 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
longaway 2003-09-28
  • 打赏
  • 举报
回复
拜托,居然有那么多专家。i 服了。
不管怎么说,这就是 java 。
i = i ++;
i = i --;
i 得值都不会变的。

之所以作为一道题目出现,就是告诉你这个事实。

真有兴趣,哪位看看字节码是怎么实现的。(我瞎猜得。)

另:
java 和 c++ 的结果确实不一样。
但是,java是有严格定义的,所有符合规范的虚拟机或者编译器都是这个结果。
c++ 就不知道是不是了。
admiralsf 2003-09-25
  • 打赏
  • 举报
回复
如果i=2+2*(i++);\\2
是temp=i;
i=i+1;
i=2+2*(temp);

i=2+2*(i++)+2*(i++);\\4
是temp=i;
i=i+1;\\i=1
temp=i;
i=i+1;\\i=2
i=2+2*(temp)+2*(temp);\\i=6
请问高人应怎么解释

Kinli 2003-09-25
  • 打赏
  • 举报
回复
to moke33(moke): 你说有对, 在C++里结果的确是1. 但不在于编译的问题, 而是机制的问题

当运行i=i++; 时, i赋了0之后, 就会被保存在寄存器, 再执行i++;

println(i);时候的i, 是寄存器里的i. 所以是0
diaopeng 2003-09-24
  • 打赏
  • 举报
回复
狂晕~~~~楼主在考人呀??这么简单的问题都问?
alexlex 2003-09-23
  • 打赏
  • 举报
回复
i = 0;
i = i++;
相当于: tmp = i; i = i + 1; i = tmp;
执行后:i = 0

这个解释最清楚,同意zhirenshao(我属老鼠)的话,自增符合的副作用大家都知道

楼主的疑惑在于i自增之后在对自己赋值的顺序问题吧,这点就像moke33(moke) 说得,

用dev c++ 执行顺序应该是 tmp = i; i = tmp; i = i + 1 先赋值再自增 结果i=1

java 执行顺序应该是 tmp = i; i = i + 1; i = temp 先自增再赋值 由于赋值取的是临时变量temp 结果i=0

fq603fq 2003-09-23
  • 打赏
  • 举报
回复
zhirenshao(我属老鼠) ,呵呵~我只是明显地指出了副作用符~希望对楼主有用~我觉得这正是他要问的
fq603fq 2003-09-22
  • 打赏
  • 举报
回复
楼上的很多人都没有说清楚它的本质啊,希望我说的有用
这个跟c++里面一样
i++和++i都是一个整体运算,前者的值等于i,后者的值等于i+1;
而++是具有副作用的运算符,无论在前面还是在后面都将改变i的值
zhirenshao 2003-09-22
  • 打赏
  • 举报
回复
回楼上,谁说楼上都没有说出问题本质,我看是你没有弄清楼主的疑惑

jkit(郁闷之堕落的程序员 和 csdnxw(大家帮忙) 就回答得很好嘛。 他解释了在机器内部 i = i++; 这个操作是如何完成的。

请看以上二人的回复
csdnxw 2003-09-19
  • 打赏
  • 举报
回复
jkit说的已经很明白了,要从类的观点看待这些问题。

to admirals,这不是编译器的bug,是逻辑错误。

i = 0;
i=2+(i++);//i=2;

1 取出i的值 temp = i // temp = i = 0
2 i自加 // temp = 0 , i = 1
3 i = 2 + temp // i = 2 + 0 = 2

何错只有?
ratjohn 2003-09-19
  • 打赏
  • 举报
回复
胡说!i++是先运算,再加一,所以值为0
admiralsf 2003-09-16
  • 打赏
  • 举报
回复
试过i=(i++);//i=0
i=2+(i++);//i=2;
i=2+(i++)+(i++);//i=3
i=2+2*(i++)+2*(i++);//i=4
i=2+2*(++i)+2*(++i);//i=8
i=2+2*(++i)+2*(i++);//i=6
充分说明第次出现的i++没执行,这一定是编译器的bug。



admiralsf 2003-09-16
  • 打赏
  • 举报
回复
虽然解释的通但是没有道理
peter207 2003-09-08
  • 打赏
  • 举报
回复
to lsy110(毛毛)
不管怎么样,i++的操作总应该在print之前执行吧
我觉得jvm的机制跟c,c++的不一样,
moke33(moke) 已经测试过c++的结果是1了
ttaomeng 2003-09-08
  • 打赏
  • 举报
回复
对的对的,都是一样
isquare 2003-09-08
  • 打赏
  • 举报
回复
上面JKIT说的很明白了,你可以在机子上试试
moke33 2003-08-27
  • 打赏
  • 举报
回复
这个和具体的编译器应该有一定关系吧,我在Dev-c++中测试的结果是1
jdk1.4 是0

关于++和--,在c++和java中不是一样的吗?
怎么会有这种结果?
lsy110 2003-08-27
  • 打赏
  • 举报
回复
噢!對不起,上面我的帖子講錯了,其實:
-------------------------------------------------
int i = 0;
i = i++; --〉如果是i++,那么此次操作后,i=1,那么println(i)等于1;由于你是i=i++,那
么當前操作i=0賦值給i!所以就有值等于0咯!
System.out.println(i);
learnner 2003-08-27
  • 打赏
  • 举报
回复
to geyf(其实我也不会)

'先赋值后++'是对的,但是为什么++发生在println之后呢
jkit 2003-08-27
  • 打赏
  • 举报
回复
x = 0
y = x++;
相当于: tmp = x; x = x + 1; y = tmp;
执行后:y = 0

i = 0;
i = i++;
相当于: tmp = i; i = i + 1; i = tmp;
执行后:i = 0

比较一下就知道了,其实很简单。
geyf 2003-08-27
  • 打赏
  • 举报
回复
如果是:

j=i++;

你能理解吧,先赋值后++,
加载更多回复(1)

50,545

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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