黑马程序员技术交流社区

标题: 不同编译平台(C&Java)同样代码不同结果的问题~分享求讨论 [打印本页]

作者: 李春阳    时间: 2012-6-7 17:25
标题: 不同编译平台(C&Java)同样代码不同结果的问题~分享求讨论
网上看来的

这是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);
        }
}

作者: 张洁    时间: 2012-6-7 17:33
lz这个问题问的好诶~~~

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

C语言中认为 j=1 而进入下一个循环
java语言中认为 j=0 而进入下一循环。
作者: 黑马任雪刚    时间: 2012-6-7 17:54
那在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-9 18:47
黑马任雪刚 发表于 2012-6-7 17:54
那在Java中程序中:
public class Test
{        

因为System.out.println(j);在FOR循环外面,FOR循环借宿后J的值被释放了,所以打印的还是初始值0

作者: 赵兵锋    时间: 2012-6-9 20:02
  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最后是加一后的值。
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2