小弟最近才刚开始学习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在基础数据类型存储上有区别?
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在基础数据类型存储上有区别?
楼主可以看一下Java版地字节码
然后看一下C的反汇编代码
看懂了就明白怎么回事了
变量 = 表达式的值 (从右到左计算)
所以
num = num++表达式的值,num++是先取num的值作为表达式的值,然后再num累加
所以右边计算的时候,表达式的值是0,然后num变成了1,
然后左边计算,把表达式的值0赋给num,所以num还是0
#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楼给出的链接