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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

马浩 发表于 2012-5-13 12:12
x = 5;
                System.out.println((x++)+1);//x在完成运算后才自增
               System.o ...

还是你解释得比较清楚:victory:
回复 使用道具 举报
9楼解释的更清楚 受教了。。。{:soso_e179:}
回复 使用道具 举报
李斌 发表于 2012-5-15 22:33
9楼解释的更清楚 受教了。。。

学到东西就好
回复 使用道具 举报
我在想,是不是学编译原理会对这样的题有体会啊。
回复 使用道具 举报
你的答案很多我不怎么好理解!但是我根据javap -c的字节正规执行,都能得到正确答案!
回复 使用道具 举报
杨志 发表于 2012-5-16 14:37
你的答案很多我不怎么好理解!但是我根据javap -c的字节正规执行,都能得到正确答案! ...

谁说的对,或者好,并不重要,重要的是你学到东西,你的理解是什么?任何事情都要保持好奇心,尽管你觉得某人说的对,或者不对,你都要自己去证明谁是对。
回复 使用道具 举报
了无尘 发表于 2012-5-17 04:02
谁说的对,或者好,并不重要,重要的是你学到东西,你的理解是什么?任何事情都要保持好奇心,尽管你觉得 ...

我的理解或者说我的判断的结果是根据汇编的运行顺序。
这里的x++ 和++x只是压入栈区的顺序不一样。
x++,会先将数据压入栈顶,然后在将变量自加。
这样栈顶的元素就不变。
++x,会先进行自加,再去压入栈顶。
这样就导致了为什么会出现一个会加1 而另一个没有加1.
至于栈区这些就是数据结构的知识了。
而当需要数据的时候用又将变量压入栈区。这就是为什么 x++ +x++;
中的第二个x的值会等于x+1.

还有就是你的这句代码:
  1. System.out.println(x++ + 1);
复制代码
你的这句代码:你说会被解释成: x+1 x++;
但是我认为会是x先自加1,再去和1相加。
因为根据反汇编过来的代码看出:
  1. 0:   bipush  6
  2. 2:   istore_1
  3. 3:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
  4. 6:   iload_1
  5. 7:   iinc    1, 1
  6. 10:  iconst_1
  7. 11:  iadd
  8. 12:  invokevirtual   #3; //Method java/io/PrintStream.println:(I)V
  9. 15:  return
复制代码
这里的add方法是最后执行的。
本人认为当弄懂了这些个底层的东西。这些所谓的++x和x++。
还有那些个莫名其妙的题目都是浮云吧!之所以现在出这么多的问题。
就是大家都只是存在理解上面。根本没有去知道计算机真正底层是怎么去实现的。
个人意见。谢谢!
回复 使用道具 举报
杨志 发表于 2012-5-17 22:57
我的理解或者说我的判断的结果是根据汇编的运行顺序。
这里的x++ 和++x只是压入栈区的顺序不一样。
x++, ...

你的说法也不完全对,为什么呢,因为栈顶为x时,虽然是先自加,但是并没有给栈底的那个数赋值,简单来说就是为什么有些人会说是值被重置了。这个说的有点难理解,我说不太清楚

换个说法,如果真的是先自增,但x在加法运算上并没有改变值,问题出现在哪里?问题应该出现在iinc指令上
回复 使用道具 举报
了无尘 发表于 2012-5-17 23:06
你的说法也不完全对,为什么呢,因为栈顶为x时,虽然是先自加,但是并没有给栈底的那个数赋值,简单来说 ...

我的说法就是这样的呢!虽然变量自加,但是只是自加。而栈顶的元素是没有任何影响的。只有当元素被加载到栈顶中时。栈顶的元素才会变化!嘿嘿!
回复 使用道具 举报
杨志 发表于 2012-5-18 08:46
我的说法就是这样的呢!虽然变量自加,但是只是自加。而栈顶的元素是没有任何影响的。只有当元素被加载到 ...

弹栈这个东西说实话,单拿出来说很多人很难理解,呵呵
回复 使用道具 举报
关于第五题的答案我不是很明白哦
x=5;
                System.out.println(x++ + 1);
                System.out.println(x++ + x);
x++ + 1被解释成x+1 x++
x++ + x被解释成 x++  x+x

既然 x++ +x 被解释成 x先自增 然后再求和 那么应该是6+6啊 可是打印结果为11

点评

我之所这么写,x++时,x已经被取值了,也就是第一个x,第二个x是第一个x+1的值,其实怎么写看自己,能理解就行  发表于 2012-5-20 12:32
回复 使用道具 举报
自增是表达式运算之后进行的
我认为没有错呀。。。。

System.out.println((x++)+1);这个答案很显然是6,因为在+1的时候x还是5,这个结束以后x才是6

System.out.println(x+++x++);这个答案是11,第一个x是5,第二个x是6,因为第一个x已经++完成了,所以是5+6=11,结束以后x就是7了

System.out.println(x+++1+x++);这个答案是12,还是,第一个x是5,第二个x是6,同理5+1+6=12,结束以后x也是7

System.out.println(x+++x);这个答案是11,同理,第一个x是5,第二个x是6,5+6=11;只不过结束的时候x还是6,

不知道我这样理解是不是错误的,如果错了请批评我,我学习!!!
回复 使用道具 举报
 夜风 发表于 2012-5-14 22:50
金钱数目有什么用?还有,我注册的时候没用真实姓名,如果更改?

可以改的    去  黑马程序员常见问题咨询专区
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 加入黑马