请教 j=0;j++ 100次的结果还是0

BankingRegulatorLLM 2010-06-25 11:30:47
在网上看到了一篇文章,题目是这样的

【问题描述】请看如果一段代码,如果不在eclipse里运行,请写出输出结果

public static void main(String[] args) {
int j = 0;
for(int i = 0; i < 100 ; i ++){
j = j ++;
}
System.out.println(j);

}

很多人都会毫不犹豫说是100吧!告诉你,答案是0


我测试了一下,结果却是0,但是那个写文章的来寥寥几句话根本没把这个问题解释清楚,特来csdn上请教
...全文
334 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiahao0321 2010-06-25
  • 打赏
  • 举报
回复
我是一个新手。。。 这题是不是太简单了?

最基本的内存分析啊。。。 画画内存就出来了。。 还有 for循环是怎么运行貌似你都没搞明白~
androidmvc 2010-06-25
  • 打赏
  • 举报
回复
这个问题很简单嘛。。。。
看看 就知道了。。。j++ 的作用域在 for 循环之内。。。
sysoout(j);
是在for 这个循环之外。。。
for 内的j 和 syso 要输出的 j 是同一个变量是不错。。但是 在for 之内 j 是在 加 但当 for 结束之后 jvm 会再次判断 j的值 与 原来的int j 相比较。。发现 已经不是 原来的那个 j 了。。。。

而。。。你要输出地。。j 还是原来的对象。。。
说白了。。你打印的 对象没有改变。。。。

chl19871024 2010-06-25
  • 打赏
  • 举报
回复
public static void main(String[] args) {

int j = 0 ;
for (int i = 0; i < args.length; i++) {
++j;
}
System.out.println(j);
System.out.println(args.length);


}


自己看 它的长度吧!
sun0322 2010-06-25
  • 打赏
  • 举报
回复
args.length

你自己想吧!!

我对你什么也不说了!!
chl19871024 2010-06-25
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 fengjssy 的回复:]
Java code
public class ComputeTest {

public static void main(String[] args) {
int j = 0 ;
for (int i = 0; i < args.length; i++) {
j = ++ j ;
}
……
[/Quote]


你定义了个数组 却没给数组长度 你不管++j 还是 j++都会是0
sun0322 2010-06-25
  • 打赏
  • 举报
回复
i < args.length;

你循环几次啊?

<100
  • 打赏
  • 举报
回复
我还是把写这边文章人的回答贴出来吧


【问题分析】

这和JAVA的基本数据类型的运算有关,JAVA的基本数据类型都是值引用的,这跟对象不一样.同样,在你对基本数据类型进行操作后,他会生成在内存中划分出另外一块内存区.首先刚开始J = 0 , 在J = J++的时候, 等号前面的那个J已经不是J声名时的那块内存区了,JVM为他重

新为他分配一块新的内存区.比如说,int j = 0 时,j的内存地址为00xx01,值为0。那么经过第一循环的以后前面那个J内存地址为00xx02,值为0,而后面那个J(内存地址00xx01)则会进行++操作,此时他的值为1,不过他已经不能影响到前面J的值了,此时J的内存地址就已经是等号前面的那个J的内存地址了(00xx02),再进行第二循环的时候,j的内存地址是:00xx02,值是0,至于00xx01那块内存区域,因为已经没有人再使用,所以将会在下一次垃圾回收的时候被GC回收,此时他(内存地址为00xx02的J)变成后面的那个j,前面那个J 则又会重新分得一块新的内存区域00xx03,值仍然是0,而00xx02则又会被丢弃然后被GC回收,依此类推,直至最后打印时J仍然为0,但他的内存地址已经不是最开初的00xx01了,换句话说,他已经不是当初的那个J了。
  • 打赏
  • 举报
回复
public class ComputeTest {

public static void main(String[] args) {
int j = 0 ;
for (int i = 0; i < args.length; i++) {
j = ++ j ;
}
System.out.println(j);
}

}
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 sxzlc 的回复:]

你++j
还能出来0了,一定是代码写错了!

int j = 0;
for(int i = 0; i < 100 ; i ++){
j = ++j ;
}
System.out.println(j);
[/Quote]

这是我的代码 环境是myeclipse,jdk 5.0

public class ComputeTest {

public static void main(String[] args) {
int j = 0 ;
for (int i = 0; i < args.length; i++) {
j = ++ j ;
}
System.out.println(j);
}

}

结果就打印一个0 ,你不信试试。
chl19871024 2010-06-25
  • 打赏
  • 举报
回复
++j是100的!
NFSP 2010-06-25
  • 打赏
  • 举报
回复
给张“黄牌”而已,没有影响的啊
sun0322 2010-06-25
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zyc2009 的回复:]
j = ++j ;
在eclipse是要给警告的,说赋值对变量不起作用。。
[/Quote]

是有这个警告,但是对结果没有影响啊。
NFSP 2010-06-25
  • 打赏
  • 举报
回复
j = ++j ;
在eclipse是要给警告的,说赋值对变量不起作用。。
sun0322 2010-06-25
  • 打赏
  • 举报
回复
你++j
还能出来0了,一定是代码写错了!

int j = 0;
for(int i = 0; i < 100 ; i ++){
j = ++j ;
}
System.out.println(j);
jimofengye 2010-06-25
  • 打赏
  • 举报
回复
建议用断点调试。单步执行。看看具体代码执行的过程。这个能让你更加明白到底是怎么回事
sun0322 2010-06-25
  • 打赏
  • 举报
回复
你把
++j=0
的代码贴出来看看

你太der了!
ameyume 2010-06-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fengjssy 的回复:]
引用 1 楼 jimofengye 的回复:

百度 ++j和j++的区别

++ j的结果仍然是 0 ,这个和++j和j++没什么关系
[/Quote]
有道理
在VS2005里运行,结果就是100.
不知道为什么eclipse会是0
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sxzlc 的回复:]

++ j的结果仍然是 0 ,这个和++j和j++没什么关系//错!!!!

绝对有关系,有关系!!
[/Quote]
我想知道的是:结果怎么才能使100,而现在为什么会是0 ,既然你说++j,可是结果还是0 ,就算有关系和我要问的没关系啊
NFSP 2010-06-25
  • 打赏
  • 举报
回复
++j的结果是100了
sun0322 2010-06-25
  • 打赏
  • 举报
回复
++ j的结果仍然是 0 ,这个和++j和j++没什么关系//错!!!!

绝对有关系,有关系!!
加载更多回复(14)

50,530

社区成员

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

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