黑马程序员技术交流社区

标题: +=的运算 [打印本页]

作者: 黑马十八期0513    时间: 2013-1-7 10:39
标题: +=的运算
本帖最后由 姜伟 于 2013-1-7 11:44 编辑

一个很简单的代码,之前一直没有在意+=运算,这次自己动手被这个问题给难住了。
public class VarableParameter {
         public static void main(String[]args){
                             int a= add(2,3);
                             int b =add(2,3,5);                  
                    }

      public static int add(int x,int y,int...args){
                  int sum =x;
                  for(int i=0;i<args.length;i++){
                     sum +=args;
                      }
                return sum;
              }
}

为什么运行的结果,a =2,b=7?很不解,这个到底是怎么运算的?
按照我的理解应该是   
int sum =2;
     sum +=args[0]  =4      sum =4;
     sum +=args[1] =7      sum =7;
a的值为7才对,同理b的值也应该是12才对,不知道是哪儿想错了。

作者: 杨建聪    时间: 2013-1-7 10:43
sum +=args[i];
就是 sum=sum+args[i]    暂时只知道这么多,因为还没学到楼主那里,共勉
作者: 徐帅    时间: 2013-1-7 10:52
哥们啊,可变数组的定义只能放在参数最后,而你取的是可变数组的长度,add(2,3)这里,x=2,y=3,没有可变参数,
所以长度为0,而add(2,3,5),x=2,y=3,可变数组的长度为1,就是5,你的for循环中,遍历的只是可变数组,所以加的
只是可变数组的值了,而x和y并没有加。
作者: 黑马十八期0513    时间: 2013-1-7 10:57
徐帅 发表于 2013-1-7 10:52
哥们啊,可变数组的定义只能放在参数最后,而你取的是可变数组的长度,add(2,3)这里,x=2,y=3,没有可变参 ...

谢谢哥们,明白了,是我自己理解的不透彻,非常感谢,要不然可变参数这一重要内容我就掌握不好了!
作者: 胡勇敏    时间: 2013-1-7 10:58
本帖最后由 胡勇敏 于 2013-1-7 11:10 编辑

int a= add(2,3);
这句运行时 你传递给add方法的参数智能匹配add方法的前两个参数,而最后一个可变参数默认为一个空数组,所以你for循环中的i<args.length本身就不成立 不进行循环 直接返回sum的值 那肯定是 a=2 了。
而当执行到int b =add(2,3,5); 时,传递给add方法的参数先匹配前两个具体的参数,最后一个5匹配可变参数,因为只有一个元素所以形成的args数组就是一个长度为1的数组。而for循环的执行条件是i<args.length即i<1,所以只执行1次循环 sum+=args[0](sum+=args[0]其实跟sum=sum+args[0]等同)即 sum=2+5 sum=7
作者: Rancho_Gump    时间: 2013-1-7 10:58
运行int a= add(2,3);时
int sum = 2,没有args参数  结果2
运行int b= add(2,3,5);
int sum =2,args.length=1,args[0]=5结果为7


作者: 徐帅    时间: 2013-1-7 10:59
姜伟 发表于 2013-1-7 10:57
谢谢哥们,明白了,是我自己理解的不透彻,非常感谢,要不然可变参数这一重要内容我就掌握不好了! ...

呵呵,共同学习进步!一起加油!
作者: 舒远    时间: 2013-1-7 11:00
两次运算中y值都没有加。
可变参数在方法定义的时候只能放在最后一个参数位置,运行时会匹配你前面所有已定义的非可变参数。
所以你的代码两次执行y值都没有被加上
2和3分别匹配了x和y参数。结果只有2
2,3,5分别匹配x,y,args。这里args的长度为1,就是5这个值。所以是2+5 = 7

作者: 李培根    时间: 2013-1-7 11:05
姜伟 发表于 2013-1-7 10:57
谢谢哥们,明白了,是我自己理解的不透彻,非常感谢,要不然可变参数这一重要内容我就掌握不好了! ...

public static int add(int x,int y,int...args)
定义了可变参数,y没有参加运算,且创建的int类型数组和y是相同类型,所以y根本没有必要定义的。原理大家说了,提供下修改方式
可以改为
public class VarableParameter {
          public static void main(String[]args){
                              int a= add(2,3);
                              int b =add(2,3,5);                  
                    }

       public static int add(int x,int...args){//这里去掉参数int y
                   int sum =x;
                   for(int i=0;i<args.length;i++){
                      sum +=args;
                       }
                 return sum;
               }
}
或者
public class VarableParameter {
          public static void main(String[]args){
                              int a= add(2,3);
                              int b =add(2,3,5);                  
                    }

       public static int add(int x,int...args){
                   int sum =x+y;//这里加上y
                   for(int i=0;i<args.length;i++){
                      sum +=args;
                       }
                 return sum;
               }
}
推荐第一种修改方式
作者: 黑马十八期0513    时间: 2013-1-7 11:37
李培根 发表于 2013-1-7 11:05
public static int add(int x,int y,int...args)
定义了可变参数,y没有参加运算,且创建的int类型数组和 ...

请问怎样把帖子改成已解决?
作者: 徐帅    时间: 2013-1-7 11:41
本帖最后由 徐帅 于 2013-1-7 11:44 编辑
姜伟 发表于 2013-1-7 11:37
请问怎样把帖子改成已解决?


选择编辑,在你发帖时选择发帖类型的地方选择为“已解决”就OK了




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