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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1.         class ForTest {  
  2.             public static void main(String[] args) {  
  3.                 int j = 0;   
  4.                 for (int i = 0; i < 100; i++){   
  5.                   j = j++;   
  6.                 }  
  7.                 System.out.println(j);   
  8.             }  
  9.         }  
复制代码
为什么输出的是0

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 仔细理解细节就清楚了,多注意基础.

查看全部评分

9 个回复

倒序浏览
问题就出在——  j=j++

直接写j++就可以了,为什么要j=j++?
回复 使用道具 举报
本帖最后由 程金 于 2012-9-21 16:18 编辑

class ForTest {  
            public static void main(String[] args) {  
                int j = 0;   
                for (int i = 0; i < 100; i++){   
                  j = j++;   //这是先赋值了再把j的值+1,这句话等于 j=j; 然后j的值+1  .
而j的值+1得到的的值并没有赋值给j
,改成j++,能得到你想要的结果:j=j+1;
                }  
                System.out.println(j);   
            }  
        }  

点评

你怎么知道j++没有赋给j,关于这个问题我在论坛里看到好几次了,看到的回复都说的不清楚,或者说都说不明白,我认为像这种问题除非你去请教高人  发表于 2012-9-21 20:09
j++的值为什么没有赋给j呢?左右两个j不同吗?  发表于 2012-9-21 16:32
多写 明白了  发表于 2012-9-21 16:11

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
程金 发表于 2012-9-21 16:09
class ForTest {  
            public static void main(String[] args) {  
                int j = 0;  ...

我又看了一下,为什么j=j赋值完毕后j++不运算?
回复 使用道具 举报
Java代码:
  1. int j = 0;
  2. int i = 0;
  3.    for(i=0; i<100; i++)  {
  4.          j = j++;
  5.     }
  6.     System.out.println("j: " + j);
复制代码
C代码:
  1. int j = 0;
  2. int i = 0;
  3.     for(i=0; i<100; i++)
  4.     {
  5.         j = j++;
  6.     }
  7.     printf("%d\n", j);
复制代码
同一段代码 Java输出的结果0,但C输出的却是100呢?      究其原因是 两种语言的编译器不同

关于java代码最终的解释:
What happens is that the initial value of x is stored in a temporary register, then x is incremented, then the value stored in the register is asigned to the left hand side of the expression, in this case the LHS is x so x gets its original value.
int x = 1;
x = x++;
Steps:
1 initial value of x is stored in temp register. So temp = 1.
2 x is incremented. x = 2 and temp = 1.
3 the value of the temp register is assigned to the LHS. x = 1
回复 使用道具 举报
  1.         class ForTest {  
  2.             public static void main(String[] args) {  
  3.                 int j = 0;   
  4.                 for (int i = 0; i < 100; i++){   
  5.                  //赋值细节 j的初始值为:0。j=j++ 以一次循环把0赋值给了自己 ,接着第二次循环有重复了第一次循环 所以会一直是0.
  6.                   j = j++;  
  7.                 }
复制代码
回复 使用道具 举报
冯超 高级黑马 2012-9-21 19:30:26
7#
j++本身就是个赋值语句
  j = j++ 貌似没见过
回复 使用道具 举报
j=j++是先给j赋值再加1, ++j是先加1在赋值,还是有区别的,就和j+=i;和j=i+j平时没啥区别,但是涉及到short转换到int 就是数据类型提升的时候,用处就大了
回复 使用道具 举报
j=j++
相当于
右边
int temp  = j;//int temp = 0;
j = j+1;//j = 0+1;
然后 赋给左边
j = temp;//j = 0;
所以是0 吧

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马