A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 程钧杰 黑马帝   /  2011-9-1 10:01  /  2385 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么每次运行出来的都是0~9
  1. for(int gf=0 ;gf<10;gf++)
  2.                         System.out.println(gf);
  3.                 for(int gf1=0 ;gf1<10;++gf1)
  4.                         System.out.println(gf1);
复制代码
不是说前加和后加有区别的么 每次for之后 gf=gf++ 和 gf1=++gf1

5 个回复

倒序浏览
首先你要弄清楚一点:不管到底怎样自增,gf++和++gf1这两个表达式运算的最终结果都是gf加了1和gf1加1,而条件判断的时候只看gf和gf1的值,也就是说只看后面的自增表达式对判断这个值的影响
另外一点:由于gf++和++gf1没有付给任何变量,所以是个匿名的表达式,如果把它各自都赋给一个变量的话 就像你写的 a=gf++ 和 b=++gf1这样打印出来的a和b就不一样了
[ 本帖最后由 杨相国 于 2011-09-01  10:17 编辑 ]

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2 回答的不错!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-1 10:42:20
藤椅
下面就前加和后加进行比较将你的程序中的gf和gf1当做i来说明:

        i = 0时,i++是先引用i的然后再变量本身自己再加1,所以i++这个表达式的值为0,而i的值为1。
                ++i是变量本身先自己加1然后再被引用,即++i的值为1,i的值也为1。
        i = 1时,i++表达式的值为1,i的值为2。
                ++i表达式的值为2,i的值为2。
        i = 2时,i++表达式的值为2,i的值为3。
                ++i表达式的值为3,i的值为3。
        。。。
依次类推,++i和i++当然不一样,而你的for语句中每次i++或++i后比较的都是i<10;因为i的值在两个for循环中都相等(每次变化后),而你这时输出的正好是变量i的值,所一样,如果输出i++或++i肯定不一样。
     你比较的并不是i++<10或者是++i<10。
     你将你的程序中的gf<10换成gf++<10,将gf1<10换成++gf1<10,这时你输出表达式gf++或++gf1的值结
     果肯定不一样。

     其实++i和i++很简单,先加和后加后的表达式的值和变量的分别是多少,再看程序引用的是表达式的还是
变量的值就不会乱了。。

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2 回答的很好!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-1 11:03:15
板凳
杨祖国回答得非常好,如果将代码改为:(就能看出效果)
[code=java]

[/code]
[code=java]int c=0;
                 for(int gf=0 ;gf<10;c=gf++)
                        System.out.println(c);
                 for(int gf1=0 ;gf1<10;++gf1)
                        System.out.println(gf1);[/code]
回复 使用道具 举报
这个问题上面的童鞋的确已经回答的非常好了,所以在这里我就不再重复回答了~
不过为了方便LZ理解,我再补充一段等价写法吧:
使用i++的循环:[code=java]//原始代码:
for(int gf=0 ;gf<10;gf++) {            
  System.out.println(gf);
}

//等价写法:
int gf=0;
while (gf<10) {  //首先判断gf的值
gf++;           //然后gf的值自增1
System.out.println(gf);  //然后打印出gf的值
}[/code]使用++i的循环:[code=java]//原始代码:
for(int gf1=0 ;gf1<10;++gf1) {
  System.out.println(gf1);
}

//等价写法:
int gf1=0;
while (gf1<10) {  //同样是首先判断gf1的值
++gf1;           //然后gf1的值自增1
System.out.println(gf1); //然后打印出gf1的值
}[/code]比较一下使用++i的循环和使用i++的循环中的等价写法
再去理解上面的回答就好了~

此外,对于++i和i++的区别
http://bbs.itheima.com/thread-1317-1-1.html这个帖子里有说明
[ 本帖最后由 李叶 于 2011-09-01  12:05 编辑 ]
回复 使用道具 举报
黑马网友  发表于 2011-9-1 11:54:35
地板
我觉得这和for循环中的表达式的执行顺序有关,首先执行参数中第一个表达式,gf赋值为0,在判断参数中的第二个表达式是否为真,为真执行for循环体内语句,之后在执行参数中第三个表达式,这时gf后自增1,然后再判断参数中第二个表达式的真假,为真,执行循环体内语句,注意,这时的gf已经自增过1了。
   第二个for循环,gf1前自增,在输出之前它已经自增过了。所以两个for循环 语句输出的结果是一样的。
   个人认为董洁俊的回答很好,对于前自增和后自增就看你引用的是表达式还是变量了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马