你知道吗?一组有意思的程序!

jsjwql 2003-08-29 10:34:31
程序1:
public class Test1
{
public static void main(String[] args)
{

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

}

}
程序2:
public class Test1
{
public static void main(String[] args)
{

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

}
程序3:
public class Test1
{
public static void main(String[] args)
{
int j;
int i=0;
j=i++;
System.out.println("i="+i);
System.out.println("j="+j) ;


}

}

你知道这三个程序的答案吗?
1:i=1
2:i=0
3:i=1
j=0
第三个倒容易理解,但第一个与第二个程序,怎么会不相同呢?
...全文
32 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
jsjwql 2003-08-31
  • 打赏
  • 举报
回复
楼上的说的对,希望有高手解释一下!
levinjoe 2003-08-31
  • 打赏
  • 举报
回复
猜测java实现时是,先将值存发在一个寄存器,而后执行i++,再将寄存器值返回到i。具体可能要看汇编代码了,我汇编不好,希望有高手解一下!或者编译器进行了优化,具体搞不懂!
asdmonster 2003-08-31
  • 打赏
  • 举报
回复
ttt
jsjwql 2003-08-31
  • 打赏
  • 举报
回复
谢谢大家了!
xc2927 2003-08-31
  • 打赏
  • 举报
回复
很正常
可以理解
Abib 2003-08-31
  • 打赏
  • 举报
回复
鼓掌!
zhh200308 2003-08-31
  • 打赏
  • 举报
回复
我来说两句:

当JVM执行到i=i++时,它会先给个临时变量把i的值保存起来,然后i再加1,
最后把临时变量的值赋给左边的变量。
类似这样:
temp=i;
i=i+1;
i=temp;
所以结果就是i的初始值。


i=i+++i++;
i=i+++i+++i++;
i=i+++i+++i+++i++;
i=i+++i+++i+++i+++i++;
......

可以看作是这样:
i=(i++)+(i++);
i=(i++)+(i++)+(i++);
i=(i++)+(i++)+(i++)+(i++);
i=(i++)+(i++)+(i++)+(i++);
......

拿"i=(i++)+(i++)"来分析一下JVM的执行过程:
前提:i=i++执行后i=0;

首先是第一个(i++):
执行过程类似这样:
temp1=i; ==>temp1=0;
i=i+1; ==>i=1;

接着是第二个(i++)
执行过程类似这样:
temp2=i; ==>temp2=1;
i=i+1; ==>i=2;

第三步:执行所有加(+)操作并将结果赋值给左边的变量i
执行过程类似这样:
i=temp1+temp2; ==>i=0+1==>i=1;

再拿"i=(i++)+(i++)+(i++)"来分析一下JVM的执行过程:
前提:i=(i++)+(i++)执行后i=1;

首先是第一个(i++):
执行过程类似这样:
temp1=i; ==>temp1=1;
i=i+1; ==>i=2;

接着是第二个(i++)
执行过程类似这样:
temp2=i; ==>temp2=2;
i=i+1; ==>i=3;

接着是第三个(i++)
执行过程类似这样:
temp3=i; ==>temp3=3;
i=i+1; ==>i=4;

最后一步:执行所有加(+)操作并将结果赋值给左边的变量i
执行过程类似这样:
i=temp1+temp2+temp3; ==>i=1+2+3==>i=6;

......


从而得出
i=i++;
i=i+++i++;
i=i+++i+++i++;
i=i+++i+++i+++i++;
i=i+++i+++i+++i+++i++;
i=i+++i+++i+++i+++i+++i++;
......

的结果为
i=0 0
i=1 0+1;
i=6 1+2+3;
i=30 6+7+8+9;
i=160 30+31+32+33+34;
i=975 160+161+162+163+164+165;
......


如果是这种情况:
i=(++i);
i=(++i)+(++i);
i=(++i)+(++i)+(++i);
i=(++i)+(++i)+(++i)+(++i);
i=(++i)+(++i)+(++i)+(++i)+(++i);
......
就很好理解,结果:
i=1 1;
i=5 2+3;
i=21 6+7+8;
i=94 22+23+24+25;
i=485 95+96+97+98+99;
......

以上纯属个人看法,仅供参考。
yesemiman 2003-08-31
  • 打赏
  • 举报
回复
jsjwql(wql) ,当然。
jsjwql 2003-08-31
  • 打赏
  • 举报
回复
希望大家关注啊!
zjzf 2003-08-31
  • 打赏
  • 举报
回复
i see
zjzf 2003-08-31
  • 打赏
  • 举报
回复
i=0;
i=i+++i+++i+++i 和 i=i+++i+++i+++i++ 是一样的.晕
大家赶快转到.net吧
海盗2019 2003-08-31
  • 打赏
  • 举报
回复
把i++改成++i试试,还觉得好玩不,哈…
dddd8888 2003-08-31
  • 打赏
  • 举报
回复
i = i++; //i=0; ++i
jsjwql 2003-08-30
  • 打赏
  • 举报
回复
楼上的 这是怎么执行的,我不懂!
JavaBoyCaoJi 2003-08-30
  • 打赏
  • 举报
回复
运算符优先级
jsjwql 2003-08-30
  • 打赏
  • 举报
回复

int i=0
i=i++ //i=0
i=i++ + i++ //i=1 0+1
i=i++ +i++ +i++ //i=3 0+1+2
i=i++ +i++ +i++ +i++ //i=6 0+1+2+3
i=i+++i+++i+++i+++i++ //i=10 。。。。+4
i=i+++i+++i+++i+++i+++i++ //i=15 。。。。+5
i=i+++i+++i+++i+++i+++i+++i++ //i=21 。。。。+6
这个不是从上往下执行的吧?!
应该是int i=0
与各行的单独组合吧!?
janlacncn 2003-08-30
  • 打赏
  • 举报
回复
你们知道嘛:
int i=0
i=i++ //i=0
i=i+++i++ //i=1
i=i+++i+++i++ //i=3
i=i+++i+++i+++i++ //i=6
i=i+++i+++i+++i+++i++ //i=10
i=i+++i+++i+++i+++i+++i++ //i=15
i=i+++i+++i+++i+++i+++i+++i++ //i=21
你们看出规律了嘛?如果你们不信可以自己去试试!
sxhv998 2003-08-30
  • 打赏
  • 举报
回复
运算符优先级
看看书吧!
cctvnet 2003-08-30
  • 打赏
  • 举报
回复
楼上对了
flutina 2003-08-30
  • 打赏
  • 举报
回复
i=i++; 是先赋值后计算
i=++i;是先计算再赋值

int i=0
i=i++ //i=0
i=i++ + i++ //i=1 0+1
i=i++ +i++ +i++ //i=3 0+1+2
i=i++ +i++ +i++ +i++ //i=6 0+1+2+3
i=i+++i+++i+++i+++i++ //i=10 。。。。+4
i=i+++i+++i+++i+++i+++i++ //i=15 。。。。+5
i=i+++i+++i+++i+++i+++i+++i++ //i=21 。。。。+6
加载更多回复(4)

62,612

社区成员

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

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