1. 程式人生 > >深入理解計算機系統 練習題2.11 答案與分析

深入理解計算機系統 練習題2.11 答案與分析

可執行程式碼

#include <stdio.h>  
#include "stdafx.h"
#include <iostream>

using namespace std;
void inplace_swap(int *x, int *y) {
    *y = *x ^ *y;
    *x = *x ^ *y;
    *y = *x ^ *y;

}

void reverse_array(int a[],int cnt) {
    int first, last;
    for (first = 0,last = cnt - 1 ;first <= last
; first++,last--) { inplace_swap(&a[first], &a[last]); } } int main() { int a[] = {1,2,3,4,5}; int len = sizeof(a) / sizeof(int); reverse_array(a, len); for (int i = 0; i<len; i++) { cout << a[i] <<","; } cout << endl; int
b[] = { 1,2,3,4 }; int len2 = sizeof(b) / sizeof(int); reverse_array(b, len2); for (int i = 0; i<len2; i++) { cout << b[i] << ","; } cout << endl; system("pause"); }

結果演示
這裡寫圖片描述
A.對於一個長度為技術的陣列,長度cnt=2k+1,函式reverse_array最後一次的迴圈中,變數first和last的值分別是什麼
根據示例程式碼int a[] = {1,2,3,4,5};來進行講解,此時變數為
咱們一步一步分析

  1. 第一次inplace_swap時len = 5,first = 0,last = 4,所以執行inplace_swap表示a[0]與a[4]交換,交換後陣列a為[5,2,3,4,1]
  2. 第二次inplace_swap時由於first++,last–,所以first = 1,last = 3,所以執行inplace_swap表示a[1]與a[3]交換,交換後陣列為[5,4,3,2,1]
  3. 第三次inplace_swap時由於first++,last–,所以first = 2, last = 2,所以執行inplace_swap表示a[2]與a[2]交換,出現問題的過程不是交換,而是inplace_swap方法,我們來看看inplace_swap方法。
void inplace_swap(int *x, int *y) {
    *y = *x ^ *y;
    *x = *x ^ *y;
    *y = *x ^ *y;

}

此時inplace_swap(&a[first], &a[last]);傳遞的引數是什麼呢?

inplace_swap(&a[2], &a[2]);

因為我們傳送的是指標,所以現在我們int *x, int *y這兩個變數指向的是同一個變數,知道了這個我們將變數替換進去後繼續分析。

  1. 第一步*y = *x ^ *y; 替換之後a[2] = a[2] ^ a[2] =0;
  2. 第二步*x = *x ^ *y; 替換之後a[2] = 0 ^ 0 =0;
  3. 第二步*y = *x ^ *y; 替換之後a[2] = 0 ^ 0 =0;

也就是圖上所示結果
B.為什麼這時呼叫函式inplace_swap會將陣列元素設定為0?
上面已經講的很清楚,這裡不再解釋
C.對reverse_array的程式碼做哪些簡單改動就能消除這個問題?
修改很簡單,就是把first <= last;改為first < last;

#include <stdio.h>  
#include "stdafx.h"
#include <iostream>

using namespace std;
void inplace_swap(int *x, int *y) {
    *y = *x ^ *y;
    *x = *x ^ *y;
    *y = *x ^ *y;

}

void reverse_array(int a[],int cnt) {
    int first, last;
    for (first = 0,last = cnt - 1 ;first < last; first++,last--)
    {
        inplace_swap(&a[first], &a[last]);
    }
}

int main() {
    int a[] = {1,2,3,4,5};
    int len = sizeof(a) / sizeof(int);
    reverse_array(a, len);
    for (int i = 0; i<len; i++)
    {
        cout << a[i] <<",";
    }
    cout << endl;
    int b[] = { 1,2,3,4 };
    int len2 = sizeof(b) / sizeof(int);
    reverse_array(b, len2);
    for (int i = 0; i<len2; i++)
    {
        cout << b[i] << ",";
    }
    cout << endl;
    system("pause");
}