C/C++:交换两个变量的值可能存在的问题
来源:互联网 发布:eastpak知乎 编辑:程序博客网 时间:2024/06/15 18:24
C/C++:交换两个变量的值可能存在的问题
如何交换两个变量的值?
通常我们会借助第三个变量来去完成交换。
假定我们两个变量的类型都是int类型。
#include <iostream>using namespace std;void swap(int *a, int *b) { if (a == NULL || b == NULL) { return; } int tmp = *a; *a = *b; *b = tmp;}int main(){ int a = 5; int b = 6; swap(&a, &b); cout<<"a = "<<a<<";"<<endl; cout<<"b = "<<b<<";"<<endl; return 0;}
其实核心就是三句话:
c = a;a = b;b = c;
关键点是借助临时变量c来保存a的值。
这样子的交换方式大家在上学期间就很熟悉了。
今天看书,想起来很久之前看到的一种交换方式,书上还表明了一种错误的可能,这里大概记录下,以后不要踩这个坑~
#include <iostream>using namespace std;void swap(int *a, int *b) { if (a == NULL || b == NULL) { return; } *a = *a + *b; *b = *a - *b; *a = *a - *b; }int main(){ int a = 5; int b = 6; swap(&a, &b); cout<<"a = "<<a<<";"<<endl; cout<<"b = "<<b<<";"<<endl; return 0;}
见过这样的“技巧”吧?
这个技巧有两个坑。
第一个坑是溢出的问题。相加有可能导致溢出(int溢出),但是若是借助临时变量来交换则不存在这样的问题。
试想两个很大的int类型值,本身并不溢出,但是相加导致溢出,结果就错误啦~
第二个坑是两个指针指向同一地址的问题。
#include <iostream>using namespace std;void swap(int *a, int *b) { if (a == NULL || b == NULL) { return; } *a = *a + *b; *b = *a - *b; *a = *a - *b; }int main(){ int x = 5; swap(&x, &x); cout<<"x = "<<x<<";"<<endl; cout<<"x = "<<x<<";"<<endl; return 0;}
当调用swap的时候,若传入的a/b指向同一个地址(变量),会有很隐性的一个Bug:
输出看看:
[test1280@eb6347 20171113]$ g++ -o main main.C[test1280@eb6347 20171113]$ ./mainx = 0;x = 0;
具体过程大家自行算算就知道啦~
千万谨记第二种方式的两个坑,尤其是第二个,虽然不常用,也不太可能踩到。
阅读全文
0 0
- C/C++:交换两个变量的值可能存在的问题
- C 交换两个整形变量的值
- C语言-交换两个变量的值
- C语言交换两个变量的值
- C语言交换两个变量的值
- C语言交换两个变量的值
- C语言--交换两个变量的
- C语言 交换两个变量的值的实现
- 不用临时变量交换两个数的值(C实现)
- C语言中交换两个变量的值
- 黑马程序员------C语言中交换两个变量的值
- C语言小程序--交换两个变量的值
- C语言练习篇-2交换两个变量的值
- C语言 交换两个整形变量的值
- C语言之多种方法交换两个变量的值
- 引用-利用引用交换两个变量的值【C++】
- 使用C语言指针交换两个变量的值
- C语言 实现 给定两个整形变量的值,将两个值的内容进行交换
- redisUtil
- H5分享带缩略图,描述,微信内分享到好友,朋友圈等
- 封装okHttp 上下刷新
- java插入排序代码实现
- 全选/反选;删除
- C/C++:交换两个变量的值可能存在的问题
- 【1701H1】【穆晨】【171113】连续第三十四天总结
- 数据结构之队列
- java运算符
- 拷贝文件代码
- 慕课网——PHP进阶篇(正则表达式5—8)
- eclipse新建android工程提示android.support.v7错误的解决办法
- 大小写字母的转化及其ASCII码值
- 阿里OSS上传总结