黑马程序员技术交流社区

标题: ++ 与 () 的表达式 [打印本页]

作者: fso918    时间: 2011-10-14 14:01
标题: ++ 与 () 的表达式
  1. class Test{
  2.         public static void main(String[] args){
  3.         int a = 2;
  4.         int b = (a++) + a * 3;
  5.         int c = 2;
  6.         int d = c + ( c ++ * 3);
  7.         int e = 2;
  8.         int f = (e++*3) + e;
  9.         int x = 2;
  10.         int y = x +++ x *3;
  11.         System.out.println(b);
  12.         System.out.println(d);
  13.         System.out.println(f);
  14.         System.out.println(y);
  15.         }
  16. }
复制代码
输出结果是什么?为什么?
作者: 颜庭飞    时间: 2011-10-14 14:15
结果:
11
8
9
11

        int a = 2;

        int b = (a++) + a * 3; //(a++)是2,之后a++,所以a是3,b=2+3*3

        int c = 2;

        int d = c + ( c ++ * 3);//c是2,( c ++ * 3)是6,d是8.之后如果打印C,应该是3

        int e = 2;

        int f = (e++*3) + e;//e是2,(e++*3)=6,之后e是3 f=6+3

        int x = 2;

        int y = x +++ x *3;//x是2,++x=3,y=2+3*3
作者: 朱华    时间: 2011-10-14 16:44
本帖最后由 朱华 于 2011-10-14 16:45 编辑

纯手打,请区分。
明确几个概念:
+ - 其实这个加号在JAVA中有点重写的意味,比如int + int 和String + String 代表的意思是不一样的,前者是数值相加,后者是字符串内容相组合。
++ -遗传自C语言的语法,表示变量的自增,当它所处的位置不同时表示的意义也略有不同,int a = 1;syso(a++);a++代表的是先使用,后自增,打印结果为 1,syso(++a)代表的则是先自增,后使用,打印结果为2.
+++ -这涉及到运算顺序,a +++ b等同于(a++) + b,如果你将a +++ b 变为了 a + ++ b 那将等同于 a + (++b)
() -在赋值运算中,()的意义与它的数学运算中的意义一样,使括号中的运算式的优先级变为和 *  / 一样,更详细JAVA运算顺序我不想去网上复制一大堆然后发给你看,毫无意义,自己主动搜索来的记忆会更深。

好了,有了以上的概念我们可以开始做题了,我们把每个式子拆解成步骤来看:
int a = 2;int b = (a++) + a * 3; -- (1)a自增,但是此处的a数值未变,改变以后的数值将在此后生效 (2)a*3=9 (3)b = 2 + 9
int c = 2;int d = c + ( c ++ * 3); -- (1)c自增 (2)d = c + (2 * 3) (3) d = 2 + 9
int e = 2;int f = (e++*3) + e; -- (1)e自增 (2) f = (2 * 3) + e (3)f = 6 + 3
int x = 2;int y = x +++ x *3; -- (1)式子等效于y = x++ + x * 3 (2)x自增 (3)y = 2 + x * 3 (4) y = 2 + 3 * 3
作者: fso918    时间: 2011-10-14 18:49
我认为楼上的不大准确。或者不大透切。
我认为:
所谓的运算符,在java里就等同于一个方法,所以每个运算符都有返回值。就像 a+b就返回a与b的和。
同样的 小括号()也是一种运算符,也有它的返回值。
两个加号后置变量后,是说这个变量先用其自身的值作其所参加的运算,作完它所参加的运算后,再自增一。
所以,前面3个例子的括号里的变量先进行其自身锁参加的运算,而其在括号里,所以其参加的运算就局限在括号里。
所以括号运算就将其括号里的运算结果作为括号运算的结果返回,以供外部的运算使用。而括号返回 值以后,括号里变量锁参加的运算就算完了,所以括号运算返回后
会结算后置的++运算,即变量的值自增。所以例1里,括号运算完后,a就为3了。
例4 等效于 x+ (++x*3).因为优先级的++a比a++先。
另外
int q = 2;
int w = q + (q++) + q * 3;
w为多少呢?
我们习惯的运算顺序是
假设算式为 a + (c + d ) +e;
先计算 c + d 的值,然后将这个值和 a 相加,再将所得的值和 e 相加。计算机却不是这样的。
作者: zhangxinxin    时间: 2011-10-14 19:42
结果在电脑上做一遍就出来。至于原因,这里涉及到两个问题。
1.++算法
比如定义一个变量 int a;
a++:当a++参与运算时,先拿a参与运算,然后自身增加1,即a=a+1;
2.变量优先级
关于运算符优先级,在上面题目中出现的符号中,运算符号的优先级依次从大到小为:() , ++ , * , +
弄明白这两个问题,这道题基本上就搞定了。





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