今天看java解惑遇到一个问题:无情的增量操作
先看看 java 代码
public class Increment{
public static void main(String[] args)
int j=0;
int i=0;
for(;i<10,i++)
j=j++
System.out.println(j);
}
|
输出结果是0
在C语言中却为 10
int main()
{
int j=0;
int i=0;
for(;i<3;i++)
j=j++;
printf("%d;\n",j);
return 0;
}
|
我的理解是java中相当于使用一个堆栈来保存j的值。先把j的值入栈,再进行j++的操作,等到赋值的时候在用栈内的值,即0。
这应该和C的实现方式不一样,C是直接对J的存储位置进行操作。这个可以从我对C代码的汇编中理解到
.file "main.c"
.section .rodata
.LC0:
.string "%d\n"
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $36, %esp
movl $0, -12(%ebp)
movl $0, -8(%ebp)
jmp .L2
.L3:
addl $1, -12(%ebp)
addl $1
|
可以从汇编代码中看到:
movl $0, -12(%ebp) 首先对j赋值0,
addl $1, -12(%ebp)在循环中为J加1。这些操作都是直接对J的存储位置进行操作。所以结果为10 于java的机制不一样
另外,我还发现了 原来在汇编中,默认的整数占内存大小为4个字节,这样就不用区分长整形和普通int型了,实型还是4个字节,字符型一个字节。
阅读(1465) | 评论(1) | 转发(0) |