A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

网上看来的

这是C语言的代码
运行结果为
3

# include <stdio.h>

int main(void)
{
        int j = 0;
        for (int i = 0; i < 3; i ++)
        {
                j = j ++;
        }
        printf("j = %d\n",j);

        return 0;
}

这是java的代码
运行结果为
0

public class Test
{        
        public static void main(String [] args)
        {
                int j = 0;
                for (int i = 0; i < 3; i ++)
                {
                        j = j ++;
                }
                System.out.println(j);
        }
}

4 个回复

倒序浏览
lz这个问题问的好诶~~~

j=j++语句的执行顺序是先执行 j=j 赋值,再执行 j++ 语句。
此时 j=j++中,等号左边的j等于0,等号右边的j等于1;
由于同一个表达式里面对j执行了两次赋值运算(= 和++), 所以这样的结果应该是不确定的吧。

C语言中认为 j=1 而进入下一个循环
java语言中认为 j=0 而进入下一循环。
回复 使用道具 举报
那在Java中程序中:
public class Test
{        
        public static void main(String [] args)
        {
                int j = 0;
                for (int i = 0; i < 3; i ++)
                {
                        j = j ++;
                }
                System.out.println(j);
        }
}

单一的语句我明白:
int j = 0;
j = j++;
System.out.println(j);

可是for循环的每一次循环中,两个J到底是怎么变化的呢?
回复 使用道具 举报
黑马任雪刚 发表于 2012-6-7 17:54
那在Java中程序中:
public class Test
{        

因为System.out.println(j);在FOR循环外面,FOR循环借宿后J的值被释放了,所以打印的还是初始值0
回复 使用道具 举报
  1. public static void main(String[] args){
  2.                 int j=0;
  3.                 j=j++;
  4.                 j=++j;
  5.         }
  6. /*        字节码分析:
  7.         public static void main();
  8.   Signature: ()V
  9.   LineNumberTable:
  10.    line 3: 0
  11.    line 4: 2
  12.    line 5: 7
  13.    line 6: 12
  14.   Code:
  15.    Stack=1, Locals=1, Args_size=0
  16.    
  17.    0:        iconst_0//将0放入栈顶,
  18.    1:        istore_0//将栈顶的0放到局部变量0中,即j
  19. //以上即是int j=0;
  20.    2:        iload_0//将变量0的值放到栈顶
  21.    3:        iinc        0, 1//将变量0的值加1,并放回变量0中,即j中,此时j为1
  22.    6:        istore_0//将栈顶的数值拿下来放到变量0中,即把0放到j里,此时j=0
  23. //以上即是j=j++;
  24.    7:        iinc        0, 1//将变量0的值加1,并放回变量0中,即j中,此时j为1
  25.    10:        iload_0//将变量0的值放到栈顶,此时栈顶值为1
  26.    11:        istore_0//将栈顶的数值拿下来放到变量0中,即把1放到j里,此时j=1
  27. //以上即是j=++j;
  28.    12:        return
  29.   LineNumberTable:
  30.    line 3: 0
  31.    line 4: 2
  32.    line 5: 7
  33.    line 6: 12
  34. //从以上可以看出,j=j++;先将j的值临时存储,再对j运算加一,然后取出临时存储的值,赋给表达式左边的j,所以最后j还是0
  35. //j=++j;是先对j进行运算,然后把j的值临时存储,再取出来赋给表达式左边的j,所以j最后是加一后的值。
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马