繁体   English   中英

为什么void函数返回值?

[英]Why does a void function return a value?

我是一名编程初学者,并且对函数的返回值有疑问。

我正在学习Java。

我已经附上了我的书中具有经典选择排序功能的代码。

现在,显然这本书中的代码起作用了。 但是,主要功能中的这三行是我的问题的基础:

  1. int [] a = new int [] {1,9,2,8,3,7,4,6​​,5};

  2. 排序(a);

  3. if(ascending(a))System.out.println(“ Works”);

所以我的问题是:

在第2行中,如果sort()函数为void,如何检索已排序的a []?

这行不应该是:a = sort(a)吗?

public class SelectionSort
{

    public static void main(String[]args)
    {
        int []a=new int[]{1,9,2,8,3,7,4,6,5};
        sort(a);
        if(ascending(a)) System.out.println("Virðist virka");
        else System.out.println("Virkarekki");
    }

    public static void sort(int[]a)
    {
        if(a.length<2) return;
        int i=0;
        while(i!=a.length)
        {
            int k=i+1;
            while(k!=a.length)
            {
                if(a[k]<a[i])
                {
                    int tmp=a[i];
                    a[i]=a[k];
                    a[k]=tmp;
                }
            k++;
            }
        i++;
        }
    }

    public static boolean ascending(int[]a)
    {
        if(a.length<2) return true;
        int i=1;
        while(i!=a.length)
        {
            if(a[i-1]>a[i]) return false;
            i++;
        }
        return true;
    }
}

由于数组是对象,因此它们通过它们的引用(它们在内存中的位置)传递,因此sort()a[]更改也会更改main中声明的a[] 因此在函数内更改了a。 但是,你不能说

public static void change(int[] a) {
    a = new int[3];
    a = {1, 2};
}

这不会改变a本身,因为这只是使新的存储位置,该参数a点,在不改变参数。

sort()方法修改作为参数传递的数组; 也就是说,原始数组被修改。

假设您有a数组a ,其值为[ 3, 2 ] 你叫sort(a) ; 如果您的代码如下所示:

// printArray is an hypothetical method
printArray(a);
sort(a);
printArray(a);

那么输出将是:

[3, 2]
[2, 3]

结果,根本不需要sort()返回结果。

但是,您可以修改sort()方法来使数组的副本 ,排序复印并返回该副本。

void void sort(int[] a) 不返回value

相反, sort()就地修改传递给它的数组。 您将数组对象传递给sort()然后代码对其进行了修改。

http://javadude.com/articles/passbyvalue.htm

Java中的基元(例如char和int)是通过java中的值传递的。

无论类型是什么,java中的数组只是一个对象容器。

在java中,将对象作为参数传递与作为引用传递相似-在其中,您对通过参数传递的对象所做的任何修改都将在调用方法中保留这些更改。

您正在使用一种称为“按引用传递”与“按值传递”的编程语言来探讨一个概念。

当您“按值传递对象”到方法时,将获取该对象的副本并将该副本传递给方法。 因此,在被调用方法中,修改对象时,修改不会反映在调用者方法中。

当您“通过引用传递对象”到方法时,只有指向它所引用的实际对象的指针才传递给该方法。 因此,在被调用的方法中,修改对象时,所做的修改确实会反映在调用者方法中。

在Java中,所有方法参数都是“按值传递”。 更容易认为它是通过引用传递的,但事实并非如此。

现在,所有对象变量都是Java中的引用。 因此,在这种情况下,数组是一个引用。 Java通过值传递该数组引用,即,它获取“引用”的副本并将其传递。

因此,您现在可以想象有两个指向同一个数组的指针-原始指针在main()中名为“ args”,而新指针在sort()中名为“ a”

由于基础数组相同,因此使用main()中的指针“ args”或指针“ a” sort()修改数组都没关系。 他们俩都会看到变化。

这也是原因-为什么交换将无法按您期望的那样工作。

void main()
{
   badSwap(arr1, arr2); 
   // arr1 and arr2 will still point to same values as the prior line
   // because only the reference pointers are getting swapped
   // however, arr1[0] will be -99
}

void badSwap(int[] a, int[] b)
{
   a[0] = -99;
   int[] temp = a;
   a = b;
   b = temp; 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM