不多bb,直接上代码
#include <stdio.h>
#include <string.h>
#include <limits.h> // 整型数的最大最小值定义在该文件下
#include <float.h> // 浮点数数的最大最小值定义在该文件下
/*数据类型,用于测试*/
#if 1
typedef int data;
const char* cDateType = "int";
#else
typedef char data;
const char* cDateType = "char";
#endif
/*数据类型,用于测试*/
unsigned long DataMax(const char* type);
int swap1(data *m, data *n); // 临时变量保存交换,一般推荐
int swap2(data *m, data *n); // 加法乘法交换,只实现了加法,乘法不推荐
int swap3(data *m, data *n); // 异或交换,推荐
int swap4(data *m, data *n); // 说了思路,代码未实现,不推荐
// 主函数入口
int main(int argc, char const *argv[])
{
// 测试用例
data a = 8;
data b = 5;
printf("***:%d %d\n", a, b);
swap1(&a, &b);
printf("---:%d %d\n", a, b);
swap2(&a, &b);
printf("---:%d %d\n", a, b);
swap3(&a, &b);
printf("---:%d %d\n", a, b);
return 0;
}
// 临时变量保存交换
int swap1(data *m, data *n)
{
if(!m || !n) // 对输入参数的合法性进行判断
{
printf("[%s][%s][%d] parameter error\n", __FILE__, __FUNCTION__, __LINE__);
return -1;
}
data t; // 引用临时变量存储
t = *m;
*m = *n;
*n = t;
return 0;
}
// 加法乘法交换(考虑越界问题,乘法更容易越界,方法和加法一样)
int swap2(data *m, data *n)
{
if(!m || !n) // 对输入参数的合法性进行判断
{
printf("[%s][%s][%d] parameter error\n", __FILE__, __FUNCTION__, __LINE__);
return -1;
}
if((unsigned long)(*m + *n) > DataMax(cDateType)) // 是否越界
{
printf("[%s][%s][%d] parameter error\n", __FILE__, __FUNCTION__, __LINE__);
return -1;
}
*m = *m + *n;
*n = *m - *n;
*m = *m - *n;
return 0;
}
// 异或交换,这个方法比较推荐,不用考虑越界问题
int swap3(data *m, data *n)
{
if(!m || !n) // 对输入参数的合法性进行判断
{
printf("[%s][%s][%d] parameter error\n", __FILE__, __FUNCTION__, __LINE__);
return -1;
}
*m = *m ^ *n;
*n = *m ^ *n;
*m = *m ^ *n;
return 0;
}
// 还有移位交换 这个简单说下思路不实现具体代码
/*
如果是char类型,把它拆分为高四位和低四位,局限性在于字符型数据本身占用了5位就会运算序错误
如果是int类型, 把它拆分为高16位和低16位,
其他的同理,把其中一个数据的低位左移到高位,然后再右移赋值,这个和加法乘法比较类似,不过要求每个数据都只能用了一半的位,所以不建议使用
*/
int swap4(data *m, data *n)
{
if(!m || !n) // 对输入参数的合法性进行判断
{
printf("[%s][%s][%d] parameter error\n", __FILE__, __FUNCTION__, __LINE__);
return -1;
}
}
// 返回数据类型的最大值,用于越界判断
unsigned long DataMax(const char* type)
{
unsigned long max;
if(!type)
{
printf("[%s][%s][%d] parameter error\n", __FILE__, __FUNCTION__, __LINE__);
return -1;
}
// 判断数据类型
if(strcasecmp("char", type) == 0) // windows是stricmp,linux是strcasecmp.不区分大小写比较字符串
{
max = CHAR_MAX;
}
else if(strcasecmp("unsigned char", type) == 0)
{
max = CHAR_MAX;
}
else if(strcasecmp("short", type) == 0)
{
max = SHRT_MAX;
}
else if(strcasecmp("unsigned short", type) == 0)
{
max = USHRT_MAX;
}
else if(strcasecmp("int", type) == 0)
{
max = INT_MAX;
}
else if(strcasecmp("long", type) == 0)
{
max = LONG_MAX;
}
else if(strcasecmp("unsigned long", type) == 0)
{
max = ULONG_MAX;
}
else // 懒,剩下的不想写了,最小值一个道理,只是需要注意下需要用合适的数据保存值
{
printf("[%s][%s][%d] parameter error\n", __FILE__, __FUNCTION__, __LINE__);
return -1;
}
return max;
}