黑马程序员技术交流社区

标题: 参数相加问题 [打印本页]

作者: 恩恩    时间: 2013-12-23 01:32
标题: 参数相加问题

  1. <P>public class AvariableParameter {
  2. public static void main(String[] args) {
  3. System.out.println(add(2, 3));
  4. System.out.println(add(2, 3,5));
  5. System.out.println(add(2, 3,6,7));
  6. }

  7. public static int add(int x , int ... args){
  8. int sum = 0 ;
  9. </P>
  10. <P> </P>
  11. <P>for (int i = 0; i < args.length; i++) {
  12. sum +=args[i];

  13. }
  14. return sum ;
  15. }
  16. }</P>
复制代码
上面的代码我觉得很怪异,
就说这个for循环这里,第一个add(2,3)穿进去的参数明明是两个呀,为什么这里我打印出来的args.length是1,这个for循环只能执行一次,而且sum的值是3,我觉得应该执行两次,第一次是加2,然后再加3,一下同问,求解。而且,为什么每次要给sum赋初值为X,结果才能使两个参数的相加,得到正确的结果。
作者: smileven    时间: 2013-12-23 02:22
本帖最后由 smileven 于 2013-12-23 02:25 编辑

主函数中args是一个引用,指向从代码开始处的第一个变量。
add()函数有两个参数,一个x,一个是args数组。
当第一次add(2,3)的时候,2的值是赋给x的,而强制的将args的引用值从代码开始出指向了参数3。所以rgs.length当然也就是1了。
第二次add(2,3,5)的时候,2的值依旧赋给x,强制将args的引用值指向了数组{[3][5]}的开始处。所以args.length当然也就是2了。

在求sum的时候操作里面只是相加了args数组中的值,并没有加参数x的值,所以值是不对的。
可以把代码改成这样的:
  1. public class AvariableParameter {
  2.         public static void main(String[] args) {
  3.                 System.out.println(add(2, 3));
  4.                 System.out.println(add(2, 3, 5));
  5.                 System.out.println(add(2, 3, 6, 7));
  6.         }
  7.         public static int add(int ... args){
  8.                 int sum = 0 ;
  9.                 for (int i = 0; i < args.length; i++) {
  10.                         sum += args[i];
  11.                 }
  12.                 return sum ;
  13.         }
  14. }
复制代码
或者改成这样的:
  1. public class AvariableParameter {
  2.         public static void main(String[] args) {
  3.                 System.out.println(add(2, 3));
  4.                 System.out.println(add(2, 3, 5));
  5.                 System.out.println(add(2, 3, 6, 7));
  6.         }

  7.         public static int add(int x , int ... args){
  8.                 int sum = 0 ;
  9.                 for (int i = 0; i < args.length; i++) {
  10.                         sum += args[i];
  11.                 }
  12.                 return sum + x ;
  13.         }
  14. }
复制代码




作者: 刘旭升    时间: 2013-12-23 08:16
smileven 发表于 2013-12-23 02:22
主函数中args是一个引用,指向从代码开始处的第一个变量。
add()函数有两个参数,一个x,一个是args数组。
...

回答得真好,受教了。:handshake
作者: 松毛    时间: 2013-12-23 08:32
本帖最后由 松毛 于 2013-12-23 08:36 编辑

请看参数列表add(int x , int ... args);参数列表中,第一个参数时传入进来的int类型的值,第二个参数才是可变参数列表,当你传入的是add(2,3)时,第一个2就是int类型的值,第二个才是可变参数数组中的值,所以args的长度也就只为1了。所以当你sum赋初始值值为0时,方法中sum +=args只计算了数组args中的值,而没有把第一个2加入进去,所以每次计算出来的都是可变参数数组中的和而没有把第一个参数加进去。只有当你把sum的初始值赋值为传入参数的第一个值,它才会计算出方法参数列表中所有元素的和。后面的都一样。
  1. public class <span style="font-family: Monaco, Consolas, 'Lucida Console', 'Courier New', serif; line-height: 21.59375px; background-color: rgb(255, 255, 255);">AvariableParameter</span> {
  2.         public static void main(String[] args) {
  3.                 System.out.println(add(2, 3));
  4.                 System.out.println(add(2, 3,5));
  5.                 System.out.println(add(2, 3,6,7));
  6.         }
  7.        
  8.         public static int add(int x , int ... args){
  9.                 int sum = x ;  //要想算全部参数相加的和,这里的sum的值就应该为x;
  10.                 for (int i = 0; i < args.length; i++) {   //for循环中只计算了args中所有元素的值,而没有加传入的第一个参数;
  11.                         sum += args[i];       
  12.                 }
  13.                 return sum ;
  14.         }
  15. }
复制代码




作者: 恩恩    时间: 2013-12-23 10:18
smileven 发表于 2013-12-23 02:22
主函数中args是一个引用,指向从代码开始处的第一个变量。
add()函数有两个参数,一个x,一个是args数组。
...

原来是这样,懂了,非常感谢。
作者: 恩恩    时间: 2013-12-23 11:28
smileven 发表于 2013-12-23 02:22
主函数中args是一个引用,指向从代码开始处的第一个变量。
add()函数有两个参数,一个x,一个是args数组。
...

原来他是这么回事,我说嘛,昨天搞得头大。谢谢




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