黑马程序员技术交流社区
标题:
请问下面程序的结果是?为什么?
[打印本页]
作者:
傲鸽
时间:
2013-6-25 01:06
标题:
请问下面程序的结果是?为什么?
本帖最后由 孙百鑫 于 2013-6-30 08:34 编辑
public class Test3 {
public static void main(String[] args) {
int j = 0;
for (int i = 0; i < 100; i++)
j = j++;
System.out.println(j);
}
}
复制代码
作者:
孙金鑫
时间:
2013-6-25 01:29
//答案是:0,关于j++;这种后加的,下面这个小例子可以帮你理解
public class Test3
{
public static void main(String[] args)
{
int j = 0;
int[] buf = new int[5];
for(int i=0;i<5;i++)
{
buf[i]=j++;
}
for(int b : buf)
{
System.out.println(b);
}
}
}
复制代码
作者:
孙金鑫
时间:
2013-6-25 01:53
突然想起一点问题来,为什么不能重新编辑了呢?
哎,真失败....
public class Test3
{
public static void main(String[] args)
{
int j = 0;
for(int i=0;i<100;i++)
{
j++; //这里的j = j++;相当于每次j被赋值为0;
}
System.out.println(j);
}
}
复制代码
作者:
uuom
时间:
2013-6-25 09:10
应该是每次打印j的值,即0~99
作者:
uuom
时间:
2013-6-25 09:13
好吧,我的理解不对。
作者:
ytblght55
时间:
2013-6-25 09:17
楼主你看下面的2个函数和你的函数差不多,就是你的打印语句只输出一次,下面定义了2个变量助于理解!
主要问题还是虚拟机运行机制的问题!!!你看下下面的2个例子希望帮助你理解!!!
public static void main(String args[])
{
inti,j;
i=0;
for(j=0;j<5;j++)
{
i=i++;
System.out.println("i="+i);
}
}
}
C:
#include<stdio.h>
main()
{
inti,j;
i=0;
for(j=0;j<5;j++)
{
i=i++;
printf("i=%d\n",i);
}
}
你也许会问,这么简单的程序会有什么问题呢?是的,如果不相信的话,你可以运行一下这两个程序,得到的结果非常让人震惊。
第一个JAVA程序得出的结果如下:
i=0
i=0
i=0
i=0
i=0
而第二个C程序得出的结果如下:
i=1
i=2
i=3
i=4
i=5
同样都是i=i++,为什么得出的结果会有这么大的差异呢?原来是在编译器上出了问题,java的编译器在遇到i++和i- -的时候会重新为变量运算分配一块内存空间,以存放原始的值,而在完成了赋值运算之后,将这块内存释放掉,下面首先看一下如果是j=i++的情况:
i的原始值存放在后开辟的内存中,最后这个值将赋值给j,这样j=i++后,j就会得到i的值,而i又将自加,所以,在释放内存之后,原来存放j和i的地方将得到值将是:j(此时的值等于初始i值)和i(i自加后的值)。
明白了上面的问题,让我们接下来看看i=i++的情况:
所以这样最后一次循环内的结果仍旧是i(即0)。
而C语言中的i=i++就只是完成i++的内容,所以结论会不同。这种情况说明java和c的处理语法的机制不同,如果在程序中只输入i++就不会出现这个方面的问题,所以大家在以后的程序中如果使用到i=i++的时候要格外小心,一般只需要用i++就不会有问题了。
作者:
ytblght55
时间:
2013-6-25 09:19
ytblght55 发表于 2013-6-25 09:17
楼主你看下面的2个函数和你的函数差不多,就是你的打印语句只输出一次,下面定义了2个变量助于理解!
主要问题 ...
你不是在云5提问了,帮你写出来了,有内存图便以理解
作者:
280270738
时间:
2013-6-25 10:40
运行结果是0.我也没想通,如果按照老毕的讲解的话应该不会出现0这个结果啊。现在觉得老毕可能也理解错了。百度了下呢也没得到什么好的答案。http://blog.sina.com.cn/s/blog_71643cb101011z7u.html这里面将了下,至于原理是什么就不知道了
作者:
280270738
时间:
2013-6-25 15:44
找到答案了http://hi.baidu.com/lover_actually/item/e9e7b73eb2e5ba88c2cf2992
作者:
刘_鑫
时间:
2013-6-25 20:36
在JAVA中,会先把j的值拷贝到一个临时变量区,然后在对j变量加1,最后返回临时变量区的值。把j=j++这条语句修改成为j++即可了。
作者:
郭贺朋
时间:
2013-6-25 21:16
public class Test3 {
public static void main(String[] args) {
int j = 0;//给j赋值为0
for (int i = 0; i < 100; i++)//定义了一个for循环,i初始值为0,
j = j++;//j++,但是++在j后边,所以是先赋值给j,然后再执行++,因为上边赋值为j=0,所以这个时候j还是为0
System.out.println(j);//输出j的值为0
}
}
这里考察的主要是前++和后++的问题。如果上边代码的j=j++,改为j=++j;则输出结果为1
作者:
哪颗最亮的星星
时间:
2013-6-26 22:27
答案是0,因为变量j并没有参加for循环。
作者:
王瀛
时间:
2013-6-26 23:01
打印 0 一次
首先for循环没有{},只是j=j++一直在循环,sop输出语句仅执行一次;
其次,关于j=j++; 这里 j的值一直是0,(好像是)在内存中有一个 0的副本
所以最后打印0
作者:
孙百鑫
时间:
2013-6-30 08:34
楼主您好,帖子长时间没有动态我已经将您的帖子改成已解决。如有问题请私密我哦~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2