小弟最近才刚开始学习JAVA,碰见了一个很不理解的地方,问题和代码如下,希望有大牛能帮小弟答疑解惑,谢谢了!!
   
   
   public class Test{
         public static void main(String[] args){
           int num = 0 ;
           for(int i = 0 ; i < 100 ; i++) {
             num = num++; 
         }
         System.out.println(num);
      }
    }
       (1)为什么结果打印出来的是0而不是100呢?若我把循环体内的左边的num变量省去(循环体内变成 num++) 或者 将右边num变量的++号放在右边num变量之前(循环体内变成 num = ++num),而打印的结果却都是100 ,这是为什么呢?JAVA在栈中存储的基础数据类型是不是和在堆中分配内存一样,还是有引用的存在?
          
    (2)将上面的代码用C语言实现,不论左边的num变量存在与否,还是++的摆放位置,最终打印出来的结果都是100,这难道是和编译器的机制有关,还是java和C在基础数据类型存储上有区别?       

解决方案 »

  1.   

    在一个表达式里对同一个变量赋值超过1次注定是个悲剧http://hi.baidu.com/freish/blog/item/aa947f8b42c4e118c9fc7a07.html
      

  2.   

    因为第一次num++后num为1,但是num++为0,num = num++又将num赋值为0,以此循环永远都是0.而第一次++num后num为1,且++num也为1,num = ++num等于是没有赋值,也就相当于num++一个结果.
      

  3.   

    与各自的编译器处理方式有关
    楼主可以看一下Java版地字节码
    然后看一下C的反汇编代码
    看懂了就明白怎么回事了
      

  4.   

    赋值语句
    变量 = 表达式的值 (从右到左计算)
    所以
    num = num++表达式的值,num++是先取num的值作为表达式的值,然后再num累加
    所以右边计算的时候,表达式的值是0,然后num变成了1,
    然后左边计算,把表达式的值0赋给num,所以num还是0
      

  5.   


    #include <stdio.h>
    int main()
    {
        int num=0;
    for(int i=0; i<10; ++i){
    num = num++;
    }
    cout << num << endl;
    system("pause");
    return 0;}
    以下是VC6反汇编结果的部分
    192:      int num=0;
    00401578   mov         dword ptr [ebp-4],0
    以下是num=num++这句的反汇编结果
    00401597   mov         ecx,dword ptr [ebp-4]//将Num复制到ecx中
    0040159A   mov         dword ptr [ebp-4],ecx //将ecx中的值赋给num,即使num=num
    0040159D   mov         edx,dword ptr [ebp-4]//将num的值赋给edx
    004015A0   add         edx,1 //edx进行自增
    004015A3   mov         dword ptr [ebp-4],edx//自增后的值赋给num
    从这个过程可以看出,num的值最后都将存放于ptr [ebp-4]中至于Java的字节码,参看1楼给出的链接