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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xietansheng 中级黑马   /  2014-2-25 20:50  /  1137 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面方法结果为:
2
5
12
请问为什么,能不能详细说明一下
  1. class Demo
  2. {
  3.         public static void main(String[] args) throws Exception
  4.         {
  5.                 System.out.println(fun());
  6.         }

  7.         public static int fun()
  8.         {
  9.                 int i = 0;
  10.                 try
  11.                 {
  12.                         System.out.println(i += ++i + 1);
  13.                 }
  14.                 finally
  15.                 {
  16.                         i -= --i - 1;
  17.                 }
  18.                 System.out.println(i += i++ + 1);
  19.                 return i += ++i + 1;
  20.         }
  21. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

8 个回复

倒序浏览
楼主可以分解公式啊     i++是先用后加 ++i是先加后用
class text1
{
        public static void main(String[] args) throws Exception
        {
                System.out.println(fun());
        }

        public static int fun()
        {
                int i = 0;
                try
                {
                        System.out.println(i += ++i + 1);//分解步骤 j= ++i+1,i+=j
                }
                finally
                {
                        i -= --i - 1;//这边后i为2
                }
                System.out.println(i += i++ + 1);//j=i++ +1=3  i+=j 后 i为5
                return i += ++i + 1; //j=++i +1=6  i+=j 后i 为12
        }
}

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
  1. public class JustTest {

  2.         /**
  3.          * @param args
  4.          * @throws IOException
  5.          */
  6.         public static void main(String[] args) throws Exception
  7.     {
  8.             System.out.println(fun());
  9.     }

  10.     public static int fun()
  11.     {
  12.             int i = 0;
  13.             try
  14.             {
  15.                     /*
  16.                      * a=b+c是先将b+c计算出来,再赋值给a
  17.                      * i+=x等价于i=i+x,在这里等号左边的i是一个变量,等号右边的i其实是一个确定的值(也就是运算之前i的值)
  18.                      * 在这里,i += ++i + 1,等价于i=i+(++i +1),也就是i=0+(++0 +1),结果为2
  19.                      *
  20.                      */
  21.                     System.out.println(i += ++i + 1);
  22.             }
  23.             finally
  24.             {
  25.                     /*
  26.                      * 分析同上,转换一下,等价形式为i=i-(--i-1),也就是i=2-(--2-1)
  27.                      * --2=1,1-1=0,2-0=2,所以在这里i的值扔为2
  28.                      */
  29.                 i -= --i - 1;
  30.             }
  31.             /*
  32.              * 分析同上,但需要注意的是这里出现的是i++
  33.              * 与++i不同的是,++i在参与运算的时候已经在原来的基础上加1,i++参与运算时依然是原来i的值,之后再加1
  34.              * 等价形式为,i=i+(i++ + 1),这里分解一下,分解为int x=i++ + 1;i=i + x;亦即int x=2++ +1;i=2+x;
  35.              * 第一句运算结果为x=3,这时会有将i赋值为3隐含过程(因为i++),然后再执行第二句i=2+x,又将5赋值给了i
  36.              * 所以打印结果为5
  37.              */
  38.             System.out.println(i += i++ + 1);
  39.             /*
  40.              * 这里分析同最上面
  41.              */
  42.             return i += ++i + 1;
  43.     }

  44. }
复制代码


评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
* 在这里,i += ++i + 1,等价于i=i+(++i +1),也就是i=0+(++0 +1),结果为2

这里的意思是不是可以理解为在进行运算之前公式中的变量被赋值且不再变化呢??但是自增运算符不是自增1吗?为什么不会影响到+=时的i呢??
回复 使用道具 举报
本帖最后由 枫露 于 2014-2-26 00:22 编辑
  1. public class Test {

  2. /**
  3. * @param args
  4. */
  5. public static void main(String[] args) {
  6. // TODO Auto-generated method stub
  7.                   System.out.println(fun());

  8. }
  9. public static int fun(){
  10.            int i=0;
  11.   try{
  12.                    System.out.println(i += ++i+1); //++i=1
  13.                    //i += ++i+1 0 += 1+1或者 0=0+(1+1) i=2
  14.        }catch(Exception e){
  15.                    e.printStackTrace();
  16.        }finally{
  17.                     i -= --i -1; //现在i=2
  18.                     //i -= --i -1 2 -=1-1或者2 =2-(1-1)
  19.        }
  20.                      System.out.println(i += i++ +1); // 现在i=2 i++ +1=3
  21.                       //i += i++ +1 2 += 2++ +1或者 2=2+(2++ +1)
  22.                      return i += ++i+1; //5 +=6+1或者5 =5+(6+1)
  23.      }
  24. }
复制代码


评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
絮缘小默 发表于 2014-2-25 22:57
这里的意思是不是可以理解为在进行运算之前公式中的变量被赋值且不再变化呢??但是自增运算符不是自增1吗 ...

对,就是这样。++i是先自增,再参与运算,i++是先参与运算再自增
回复 使用道具 举报
对,就是这样。++i是先自增,再参与运算,i++是先参与运算再自增

我问的不是这个我问的是在 i+= ++i+1算式中进行赋值运算“+=”时为什么i为0而不是i自增后的1
回复 使用道具 举报
i+= ++i+1其实就是i=i+(++i)+1,这样你清楚了吧?
回复 使用道具 举报
i+= ++i+1其实也就是i=0;i=i+i+1;然后得出的i值在自加1
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马