返回列表 发帖

向各位大侠求教

本人一初学java者,有一问题怎么也看不懂,请各位大侠指教!
public class Operator15 {
         public final static void main(String args[]){
                 int x=3;
                 int y=5;
                 int res=x+(x++)+(++x)+y;
                 System.out.println(res);
         }
}
程序执行结果是:16.可我觉得应是18才对。就是先计算++x值为3,然后自增为4,在计算++x应该先自增为5,再参与计算。然后计算x为5,y为5,这样结果就应该是18了,问题出在哪?
然后我把程序做了一个小修改:
public class Operator15 {
         public final static void main(String args[]){
                 int x=3;
                 int y=5;
                 int res=(x++)+(++x)+x+y;
                 System.out.println(res);
         }
}
执行结果就是18了,这两个程序有什么差别吗?
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友

这涉及到编译器对代码的处理方式。
x+(x++)+(++x)+y  作为相加运算,从左边开始
先处理x+(x++)  这时x=3     x+(x++)=3+(3++)=6   这时x=4了。
然后处理后面的
6+(++4)=11   这时x=5
最后是
11+y=16

++运算的规则简单。但是混在在表达式中,就很麻烦。并且各个编译器对其解释方式不同。所以,不要随便使用。
在网上购买本书的读者,请给本书发一个好评。谢谢大家。

TOP

回复 2# fwbook


    谢谢您的指导。
按照您的解释,后面的程序(x++)+(++x)+x+y,也应该从左边开始,先处理(x++)+(++x),这时x=3,(x++)+(++x)=3+(++4)=8,这时候x=5了。然后处理后面的8+5=13,最后是13+y=18.
这是和程序运行结果是一样的。
我还有一个疑问,不是说()的作用是要先进行运算吗?也就是在两段程序中,应该优先进行括号内的运算,按照您的解释,还是从左至右进行依次运算,这样和括号的作用不是有冲突了吗?希望您能再指导一下,先谢谢啊!

TOP

括号只是改变局部的顺序,但不会改变整体顺序。
在网上购买本书的读者,请给本书发一个好评。谢谢大家。

TOP

还是有点不明白,您的意思是在赋值的时候,应该是从左到右依次赋值,计算的时候再考虑括号的作用,是这样的吗?

TOP

回复 5# 好好学习


    准确的说,括号只是改变结合的方式,并不改变优先级。例如


5+3-8加上括号5+(3-8)后,优先级不变,还是先计算加号。只是不再计算5+3,而是要计算5+括号里面的内容。这个时候,再计算括号里面的内容。

TOP

有些明白了,就是其实赋值的时候,是从左到右依次赋值的,并不是有括号的就先赋值,是这个意思吗

TOP

返回列表