C++ a^=b b^=a a^=b bug 求解

CSDN問答 2022-01-08 05:55:42 阅读数:395

c++ bug 求解

練手寫了簡答選擇排序代碼如下:

#include <iostream>#include <array>using namespace std;#define DEBUG 1template <typename T>void swap_pos(T &a, T &b){ #if DEBUG cout << a << " " << b << endl; #endif a ^= b; #if DEBUG cout << a << " " << b << endl; #endif b ^= a; #if DEBUG cout << a << " " << b << endl; #endif a ^= b; #if DEBUG cout << a << " " << b << endl; #endif}template <typename T>void printArr(T const& arr){ for(auto it = arr.begin(); it != arr.end(); it++){ cout << *it << " "; }}template <typename T>void selectSort(T& arr){ int nSize = arr.size(); //add one elem as min_holder int min_pos = 0; for(int i=0; i<nSize; i++){ min_pos = i; for(int j=i+1; j<nSize; j++){ if(arr[min_pos] > arr[j]){ min_pos = j; } } swap_pos(arr[i],arr[min_pos]); //bug at i=3, min_pos=3 for some reason #if DEBUG printArr(arr); cout << "\n"; #endif }}int main(){ array<int, 10> og_arr = {2,3,4,1,5,6,9,8,7,0}; array<int, 10> arr(og_arr); selectSort(arr); printArr(arr);}

swap_pos 會在 i,min_pos 均為3的循環出錯,打出信息如下:

compiler:gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)

還請高人指點這是哪方面的問題,多謝!




采納答案:

看不懂你為什麼要用預處理?你的問題就是在52行處交換的時候,要是i==min_pos的話,你執行完14行之後,arr[i]=0,arr[min_pos]=0,這就是i=min_pos的結果,所以應該在交換的前面添加一句,當i!=min_posd的時候才能交換,否則不交換。

 if(i!=min_pos){ swap_pos(arr[i], arr[min_pos]); //bug at i=3, min_pos=3 for some reason } printArr(arr); cout << "\n";


其他答案2:

CSDN 官網問答團隊-杜康

讀了好幾遍,沒明白您的問題是啥

版权声明:本文为[CSDN問答]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201080555423771.html