EverNoob 2021-03-03 21:59 采纳率: 75%
浏览 74
已采纳

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

练手写了简答选择排序代码如下:

#include <iostream>
#include <array>

using namespace std;

#define DEBUG 1

template <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)

还请高人指点这是哪方面的问题,多谢!

  • 写回答

2条回答 默认 最新

  • 爱晚乏客游 2021-03-04 14:23
    关注

    看不懂你为什么要用预处理?你的问题就是在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";
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)