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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© fengche 中级黑马   /  2013-10-19 21:01  /  1791 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 fengche 于 2013-10-20 15:22 编辑
  1. public class Increment {
  2.     public static void main(String[] args) {
  3.         int j = 0;
  4.         for (int i = 0; i < 100; i++)
  5.               j = j++;
  6.         System.out.println(j);
  7.     }
  8. }
复制代码
它打印的不是100而是0为什么?

评分

参与人数 1技术分 +1 收起 理由
李江 + 1 很给力!

查看全部评分

13 个回复

倒序浏览
你改成++j打印的就是100了。
回复 使用道具 举报
改成:         int j = 0;
                for (int i = 0; i < 100; i++)
                {
                    //  j = j++;
                        j=++j;
                          System.out.println(j);
                }
输出端结果为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
回复 使用道具 举报
因为j++是先复制后运算
回复 使用道具 举报
因为j++是先复制后运算,相当于int m=j;j=j+1;j=m;
回复 使用道具 举报
public class Increment {
    public static void main(String[] args) {
        int j = 0;
        for (int i = 0; i < 100; i++)
              j = ++j;
        System.out.println(j);
    }
}
把j=j++;改为j=++j;先作自增运算,然后再赋值给j,这样输出的结果就是1到100啦。
public class Increment {
    public static void main(String[] args) {
        int j = 0;
        for (int i = 0; i < 100; i++)
        {
              j = j++;
              System.out.println(j);
        }
    }
}
把for循环加上一对大括号也可以。因为j=j++;是先把j的值赋给j,然后再自增。那么输出的话,就是从1开始了。

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

回复 使用道具 举报
卜弦 中级黑马 2013-10-19 21:44:20
7#
  1. public class Increment {
  2.     public static void main(String[] args) {
  3.         int j = 0;
  4.         for (int i = 0; i < 100; i++)
  5.               j = j++;

  6.         System.out.println(j);
  7.     }
  8. }
复制代码
/*
第一次执行j=j++,由于j=0  先赋值所以j=j=0  以后每次循环开始都是先把0赋给j  j++没起到作用

有两种修改方式:1、j=j+1;
                            2、j++;
*/

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 赞一个!

查看全部评分

回复 使用道具 举报
你这是i++和++i的区别
回复 使用道具 举报
本帖最后由 回天之力 于 2013-10-19 23:56 编辑

这个就是"++"运算的问题,这个有俩种形式
1,{
     int a ,b;
     b=++a;        //这个运算过程 可以相当于:  a=a+1,b=a;   
     }
2,{
       int a,b;
       b=a++;       //这个运算过程相当于   :b=a,a=a+1;
      }
所以只要++a,就是先自加1,然后在参与运算。
a++,先参与运算,然后在参与运算。

所以你的问题是j=j++;改成j=++j;就ok啦!!!

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 很给力!

查看全部评分

回复 使用道具 举报
j最后等于0是因为j=j++是因为j先赋值,把j-0赋给j虽然for循坏一百次, 但是每次都是这样先赋值相加, 由于初始值为0,所有j的值始终为0如果想要等于一百那么就要j=++j; 表示先加1再赋值,
回复 使用道具 举报
还有一种办法就是每次j++之后的值不在赋给j,就直接是j++,
回复 使用道具 举报
先分析一下你这段代码:
1、从for循环语句开始看,int i = 0; i < 100;条件满足,进入循环,执行j=j++操作,这里j++的意思是先将j的值赋给j,再自增,上面定义了int j = 0,所以循环中j = j++;的结果还是0。然后再打印输出的结果为0。

2、执行完第一次循环之后,i自增之后值为2,2<100条件满足,再进入for循环,再做j = j++;操作,由于第一次循环j的值为0,所以第二次循环的时候j++的值还0,然后打印输出j的值还是0。

3、由以上可以得出结论,你这段代码的最终执行结果的值都是0。

4、想要使得到的值为100,则可以参考以下代码,将循环中的j = j++;改为j = ++j;j先自增,再赋值给j变量。
  1. public class Increment
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.         int j = 0;
  6.         for (int i = 0; i < 100; i++)
  7.                 {
  8.                         j = ++j;
  9.                 }
  10.                 System.out.println(j);
  11.         }
  12. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

回复 使用道具 举报
楼主要明白j = j++;这句代码对于j而言只有一次赋值就是j = j = 0; 对于j = j++这句话会执行过程可以这样分析j++先赋值给j即j = j = 0,再做自增运算j+1,但是前边赋值运算j = 0 = j。楼主可以将j = j++中的第一个j看作是x吧,就可以是x = j = 0,再做j的自增j = j + 1,但是x与j是同一个变量且值为0,最终结果j = x = 0
所以j = j++的结果是0,无论循环多少次j的结果依然是0,要实现楼主的要求,代码如下:
public class Increment {
        public static void main(String[] args) {
                int j = 0;
               
                for (int i = 0; i < 100; i++)                       
                        j++;//或者是j+=1;都可以实现楼主要求
                /*
                        j = ++j;的话用eclipse工具会提示你对j的赋值是不生效的,为方便理解把等号前的j看作x,等号后的看作y,分析过程:
                        1.执行y = y+1 = 1,进行自增运算;
                        2.同时x即是y,所以x = 1;
                        3.执行x = y,即j = j,同一个变量相等,赋值不生效,但是这个语句没有Java语法错误,只是提醒,相当于这句话没用,无效
                */
               
                System.out.println(j);
        }

}

注意j++是先赋值,再运算;++j是先运算,再赋值

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 我能学编程吗 于 2013-10-20 15:22 编辑

发表个人观点:
j = j++;从语法上是没有错的,因为运行也通过嘛!
但是我们要从人的角度去思考你的这句代码就有问题了,我知道你是想让j每次都自增1,那么从我们所学的知识来看,可用语句有如下几种:
1、j = j + 1;
2、j++; 或 ++j;
3、j+=1;
我想楼主是想使用的是第2种方式,可惜没用对,但我们知道 j++ 就相当于 j = j + 1;那么直接就使用 j++;就行了,何必多处一举用 j = j++;
所以,观上各楼的回答,我觉得用 j = j++; 和用  j = ++j;都是错误的表达,即使结果正确我们也不应该这么写表达式,理解起来就不好。所以楼主的 j = j++; 只要换成上面的3种方式的其中一种就O了,没必要去问 j = j++; 最后的结果为什么不是100,这j = j++;内部是怎么运算的都不用去管它。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马