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

2021-08-28 02:30:31 字數 2226 閱讀 3400

可執行**

#include 

#include "stdafx.h"

#include

using namespace std;

void inplace_swap(int

*x, int

*y)

void reverse_array(int a,int cnt)

}int main() ;

int len = sizeof(a) / sizeof(int);

reverse_array(a, len);

for (int i = 0; i",";

}cout << endl;

int b = ;

int len2 = sizeof(b) / sizeof(int);

reverse_array(b, len2);

for (int i = 0; i",";

}cout << endl;

system("pause");

}

結果演示

a.對於乙個長度為技術的陣列,長度cnt=2k+1,函式reverse_array最後一次的迴圈中,變數first和last的值分別是什麼

根據示例**int a = ;來進行講解,此時變數為

咱們一步一步分析

第一次inplace_swap時len = 5,first = 0,last = 4,所以執行inplace_swap表示a[0]與a[4]交換,交換後陣列a為[5,2,3,4,1]

第二次inplace_swap時由於first++,last–,所以first = 1,last = 3,所以執行inplace_swap表示a[1]與a[3]交換,交換後陣列為[5,4,3,2,1]

第三次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)

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

inplace_swap(&a

[2], &a

[2]);

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

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

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

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

也就是圖上所示結果

b.為什麼這時呼叫函式inplace_swap會將陣列元素設定為0?

上面已經講的很清楚,這裡不再解釋

c.對reverse_array的**做哪些簡單改動就能消除這個問題?

修改很簡單,就是把first <= last;改為first < last;

#include 

#include "stdafx.h"

#include

using namespace std;

void inplace_swap(int

*x, int

*y)

void reverse_array(int a,int cnt)

}int main() ;

int len = sizeof(a) / sizeof(int);

reverse_array(a, len);

for (int i = 0; i",";

}cout << endl;

int b = ;

int len2 = sizeof(b) / sizeof(int);

reverse_array(b, len2);

for (int i = 0; i",";

}cout << endl;

system("pause");

}

《深入理解計算機系統》 練習題2 36答案

注意z1變數,是先進行型別轉換,然後再執行乘法,再會隱式地將y進行型別轉換,再繼續執行乘法。z2,z3變數都是一回事。注意z4變數,x y 這裡還是int型的,所以這裡正溢位,進行截斷,還是 2147483648。然後進行型別轉換,即進行位拓展,新拓展的位上的值都為1。此函式為初始版本,是用除法來檢...

《深入理解計算機系統》 練習題2 32答案

編寫函式tsub ok的 引數是x和y,執行的運算是x y,如果計算x y不產生溢位,函式就返回1.假設你寫的 如下 int tsub ok int x,int y int tadd ok int x,int y 此函式能檢測到兩個數相加,若發生溢位,則返回0,否則返回1。如果y的值為int min...

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

測試 include include stdafx.h include using namespace std int strlonger char s,char t int main a.這道題答案說的很清楚,由於strlen採用無符號數,因為無符號數減法肯定還是無符號數不存在負數,所以所有判斷都...