java增量/减量运算符内部调用

时间:2014-02-04 21:38:53

标签: java increment quicksort

我们正在学习quickSort。这本书提供了我的问题末尾的代码。

我对findPivot方法结束时的这个调用感到好奇:

swap(array, left++, right--);

为什么那里有“++”和“ - ”?它不是递增/递减任何一个变量(在交换之前或之后)并且它不访问(例如)数组[left + 1]。

那是什么给了什么?

修改

所以在我发布问题之前,我写了以下测试代码:

public static void main(String[] args) {

    int a = 0;
    int b = 2;
    int[] array = {1,10,20,30};

    swap(array, a++,b--);

}

public static void swap(int[]array,int a, int b) 
{
    for(int i = 0; i < 10; i++)
    {
    Integer temp = array[a];
   array[a] = array[b];
   array[b] = temp;

    System.out.println("a = " + a + "\nb = " + b + "\narray a: " + array[a] + "\narray b: " + array[b]);
    }

结果如下:

a = 0 b = 2 数组a:20 数组b:1 a = 0 b = 2 数组a:1 阵列b:20 a = 0 b = 2 数组a:20 数组b:1

在方法中使用时,变量根本不会后递增。这就是我问这个问题的原因。

感谢。这是代码:

private static void swap(Integer[] array, int i, int j)
{

   Integer temp = array[i];
   array[i] = array[j];
   array[j] = temp;

}

public static void quickSort(Integer[] array, int left, int right)
{
    if(left < right)
    {
        int pivot = findPivot(array, left, right);
        quickSort(array, left, pivot - 1);
        quickSort(array, pivot + 1, right);
    }
}//quickSort

public static int findPivot(Integer[] array, int left, int right)
{
    int first = left++;
    while (left <= right)
    {
        while (left <= right && array[first].compareTo(array[left]) > 0)
        {
            left++;
        }
        while (left <= right && array[first].compareTo(array[right]) < 0)
        {
            right--;
        }
        if (left < right)
            swap(array, left++, right--);
    }
    swap(array, first, right);
    return right;
}

4 个答案:

答案 0 :(得分:6)

post-increment (§15.14.2)++)和post-decrement (§15.14.3)--)操作。这些将改变while循环中下一次迭代的值。

你基本上有这个:

while (left <= right)
{
    // ...
    if (left < right)
    {
        swap(array, left, right);
        left++;
        right--;
    }
}

如您所见,“post”表示该特定语句的值不受影响。在评估后增量操作后,它将增加变量,但传递给方法的值仍然是旧的。对于高级读者,您可以像这样编写后增量运算符(伪代码):

public int operator this++()
{
    int temp = this;
    ++this; // regular pre-increment (JLS §15.15.1)
    return temp;
}

有关预增量运算符的读数,您可以检查JLS §15.15.1

答案 1 :(得分:6)

swap(array, left++, right--);位于while循环内,因此更新后的值将用于下一循环迭代。

答案 2 :(得分:1)

java increment(++)和递减(--) 假设i++;这意味着i+1i--意味着i-1 在编程

int i = 1;
System.out.println("i : "+(i++)); // this means first print then add `1` into i;
//and
System.out.println("i : "+(++i)); // this means first add one and then print it;
// same for '--' 

答案 3 :(得分:0)

它们是后递增(++)和后递减( - )操作,因此它们将在while循环中更改下一次迭代中的值

在此行的代码中

   swap(array, left++, right--);//left++ , right-- are post increment (++) and post decrement (--) operation