Chinaunix首页 | 论坛 | 博客
  • 博客访问: 161886
  • 博文数量: 17
  • 博客积分: 1056
  • 博客等级: 少尉
  • 技术积分: 240
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-08 23:27
文章分类

全部博文(17)

文章存档

2012年(1)

2011年(1)

2009年(4)

2008年(11)

我的朋友

分类: C/C++

2008-07-09 13:59:37

今天看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) |
0

上一篇:没有了

下一篇:准备明天学习Protocol Buffers

给主人留下些什么吧!~~

xp52113142008-07-16 15:10:51

纠正一下 “默认的整数占内存大小为4个字节” 不是4个字节还是2个字节 而是编译器在编译时对内存进行了自动对齐! 参照http://dev.csdn.net/article/48/48195.shtm