困惑的问题---新手请教

刚开始学JAVA,编译器是JDK1.6,没有用IDE写
class test{
  public static void main(String args[]){
      int a=4;
      int result=(a++) +a;
      System.out.println("result="+result+",a="+a);
      a=4;
      result=a+ (a++);
      System.out.println("result="+result+",a="+a);
}
}
打印结果是:result=9,a=5;
                  result=8,a=5;
不明白为什么调一个顺序结果就变了,我觉得两次都是先做“++”运算后再做“+”的运算
,结果应该是一样的啊?  为什么不一样啊?哪位能帮忙解决下不?谢谢谢谢.......

 


问题补充:
对啊,为什么第二次的时候
a+(a++);
那个 a 依然是4呢?
而第一次
(a++)+a;
这个没括号的 a 却变成5了呢?

它的确先执行了(a++),但是它的返回值是4,而不是5,下一次再调用到a的时候才会是5

(a++) +a;

a+(a++);

这里2个(a++)都执行了。第一个执行了返回4,本身变成5,然后紧接着一个+a就调用了被改变后的a,那就是4+5

第二个表达式 a =4 (a++)返回4,本身变成5。因为第一个a排在了a++执行之前,所以它没有变成5

这里涉及到运算符的左右结合性以及运算符的优先级问题,相信你的教科书会解释这个问题的。

我觉得两次都是先做“++”运算后再做“+”的运算

你说的这句话是没错的,但是

(a++) +a;

这里,第二个a已经变成了5了,看出来了吗?

。。。刚开始学习编程吧。。。
估计所有人都会鄙视这种写法。

这样写法非常不利于代码阅读。也许你现在明白,可能过了2个月再回头看自己也弄不清到底先++ 还是先 + 了。

现在一些语言(ruby)已经取缔了 ++ 这类运算符,代码清晰是最重要的。

如果为了笔试面试就另外一回事了。嘿嘿

常见的++解释问题……

简单原因:表达式是从左到右求值的。

求值顺序:a++ ---> 返回a,然后a自增1,注意自增的时机是返回值后,做其它任何操作之前。

按照这个原则看就明白了:
code="java"+a = 4 + a = 4 + 5 = 9
// a=5

a+(a++) = 4 + (a++) = 4 + 4 = 8
// a=5
[/code]

第一个理解了,第二个也不难理解了啊,操作之前那个数是不会变的,++的逻辑就是这样的。第一个是在++调用了之后再次调用,而第二个在++调用后没有再调用了。

它的确先执行了(a++),但是它的返回值是4,而不是5,下一次再调用到a的时候才会是5

其实很多时候这样的问题可以用DEBUG调试一下,这样自己领悟的更深。。(我想初学者去学着用DEBUG调试代码应该也不是什么难事吧)

[b]注意自增的时机是产生"右值"后,做其它任何操作之前[/b]

原谅我使用"右值"这个词……

人类看一条表达式,觉得是一个操作,实际上计算机做了很多步操作,拆分开来看就行了。