黑马程序员技术交流社区

标题: 急急 这个程序为什么输出的是零 求解释 [打印本页]

作者: 尤圣回    时间: 2012-9-21 15:55
标题: 急急 这个程序为什么输出的是零 求解释
  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
作者: 刘伟平    时间: 2012-9-21 16:07
问题就出在——  j=j++

直接写j++就可以了,为什么要j=j++?
作者: 程金    时间: 2012-9-21 16:09
本帖最后由 程金 于 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);   
            }  
        }  

作者: 刘伟平    时间: 2012-9-21 16:19
程金 发表于 2012-9-21 16:09
class ForTest {  
            public static void main(String[] args) {  
                int j = 0;  ...

我又看了一下,为什么j=j赋值完毕后j++不运算?
作者: 崔朋朋    时间: 2012-9-21 17:35
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

作者: 杨华东    时间: 2012-9-21 19:00
  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
j++本身就是个赋值语句
  j = j++ 貌似没见过
作者: 赵永康    时间: 2012-9-21 22:10
j=j++是先给j赋值再加1, ++j是先加1在赋值,还是有区别的,就和j+=i;和j=i+j平时没啥区别,但是涉及到short转换到int 就是数据类型提升的时候,用处就大了
作者: 王自强    时间: 2012-9-21 22:22
j=j++
相当于
右边
int temp  = j;//int temp = 0;
j = j+1;//j = 0+1;
然后 赋给左边
j = temp;//j = 0;
所以是0 吧






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2