小朋友学C++(14):两数交换

之前学C语言的时候,咱们直接在main函数中使用“异或”位运算符,很容易实现了两数交换。 本节课将在此基础上,把交换两个数的算法,封装到swap函数中。这样不管是哪个地方想要交换两个数,调用swap函数就可以了。

程序1:

#include <iostream>
using namespace std;
void swap(int m, int n)
{
    cout << "Memory address of m: " << &m << endl;
    cout << "Memory address of n: " << &n << endl;
    cout << "\nBefore Swap:" << endl;
    cout << "m = " << m << endl;
    cout << "n = " << n << endl;
    m ^= n;
    n ^= m;
    m ^= n;
    cout << "\nAfter Swap:" << endl;
    cout << "m = " << m << endl;
    cout << "n = " << n << endl;    
}
int main(int argc, char** argv) 
{
    int a = 1;
    int b = 2;
    cout << "Memory address of a: " << &a << endl;
    cout << "Memory address of b: " << &b << endl;  
    swap(a, b);
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    return 0;
}

运行结果:

Memory address of a: 0x7fff90371cd8
Memory address of b: 0x7fff90371cdc
Memory address of m: 0x7fff90371c9c
Memory address of n: 0x7fff90371c98
Before Swap:
m = 1
n = 2
After Swap:
m = 2
n = 1
a = 1
b = 2

分析: 从结果可以看出,a和b调用swap之后,值并没对换过来。 其原因在于,形参m和n的作用域只是在swap函数内。在swap内,m = a = 1, n = b = 2,交换后m = 2, n = 1。但是,m和n的值并不会传回给a和b,导致a和b的值没有被对换。

解决方案,使用上节课讲过的引用。 程序2:

#include <iostream>
using namespace std;
void swap(int &m, int &n)
{
    cout << "Memory address of m: " << &m << endl;
    cout << "Memory address of n: " << &n << endl;
    cout << "\nBefore Swap:" << endl;
    cout << "m = " << m << endl;
    cout << "n = " << n << endl;
    m ^= n;
    n ^= m;
    m ^= n;
    cout << "\nAfter Swap:" << endl;
    cout << "m = " << m << endl;
    cout << "n = " << n << endl;    
}
int main(int argc, char** argv) 
{
    int a = 1;
    int b = 2;
    cout << "Memory address of a: " << &a << endl;
    cout << "Memory address of b: " << &b << endl;  
    swap(a, b);
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    return 0;
}

运行结果:

Memory address of a: 0x7fffd009de98
Memory address of b: 0x7fffd009de9c
Memory address of m: 0x7fffd009de98
Memory address of n: 0x7fffd009de9c
Before Swap:
m = 1
n = 2
After Swap:
m = 2
n = 1
a = 2
b = 1

分析: 使用引用后,达到了交换a和b的目的。这是因为形参m和n是实参a和b的引用,m和a是一回事,n和b是一回事。 交换m和n的值,就是交换a和b的值。

原文发布于微信公众号 - 海天一树(gh_de7b45c40e8b)

原文发表时间:2017-12-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏mathor

C语言有参数宏定义与无参数宏定义

1273
来自专栏javathings

SpringBoot 中异常处理

SpringBoot 中异常处理非常简单,通过@ControllerAdvice 和@ExceptionHandler 注解,可以实现自定义的统一异常处理模块。

4654
来自专栏技术墨客

Spring和性——数据的类型转换

在字符串到实体转换一文中介绍了Spring核心框架中使用PropertyEditor将任何字符串转换为数字、实体的方法。除了字符串到实体,Spring还提供了更...

1783
来自专栏pangguoming

Proguard使用最新,最全教程,亲自试验

最近公司有一个项目,是外包项目,由于对方也有技术人员,出于技术上的保密,需要对class文件进行二次处理,于是网上找了好久,只发现Proguard是用的最广泛而...

4513
来自专栏强仔仔

freemarker常见的一些用法(一)

今天给大家介绍一下freemarker基本用法,例如:if、 list、 判断是否为空、获取值等等之类的。 在使用之前要先在模板中设置值,这里我使用的是Spri...

2529
来自专栏函数式编程语言及工具

Scalaz(50)- scalaz-stream: 安全的无穷运算-running infinite stream freely

scalaz-stream支持无穷数据流(infinite stream),这本身是它强大的功能之一,试想有多少系统需要通过无穷运算才能得以实现。这是因为外界...

1946
来自专栏函数式编程语言及工具

Scalaz(47)- scalaz-stream: 深入了解-Source

   scalaz-stream库的主要设计目标是实现函数式的I/O编程(functional I/O)。这样用户就能使用功能单一的基础I/O函数组合成为功能完...

2805
来自专栏后端之路

Dubbo客户端返回自定义异常

虽然上一篇解决了message过长的问题 Dubbo自定义异常message过长解决 但是小伙伴仍然反映对于异常不能使用原类型而导致邮件报错太多(邮件报错基于错...

53310
来自专栏函数式编程语言及工具

Scalaz(46)- scalaz-stream 基础介绍

    scalaz-stream是一个泛函数据流配件库(functional stream combinator library),特别适用于函数式编程。sc...

2137
来自专栏编码小白

ofbiz方法一 条件查询createConditionList

一、方法代码 /** * Parses input parameters and returns an <code>EntityCondition...

2785

扫码关注云+社区