TraceLife

真正的幸福,在于对平淡生活的热爱……

导航

交换变量值

Posted on 2010-08-13 22:31  hallo  阅读(862)  评论(0编辑  收藏  举报
You must take personal responsibility. You can not change the circumstances, the seasons, or the wind, 
but you can change yourself. 
                                                                                   -- Jim Rohn

  变量交换,一个很常见的问题啦,N 多地方用到,但每次又有所不同。常见的解法有以下几种,主要区别在于 Swap 函数的形参类型差异。

 


使用 C 语言描述的解法有以下几种


  》》》  使用[指针类型]的形参

/**
    使用 指针类型 实现参数传递。
**/

#include <stdio.h>

int
Swap(int *parA, int *parB)
{
    int tmp;
    tmp = *parA;
    *parA = *parB;
    *parB = tmp;
}

int
main(void)
{
    int intA, intB;
    printf("Enter two numbers\n");
    printf("Number one x = ");
    scanf("%d", &intA);
    printf("Number two y = ");
    scanf("%d", &intB);
    Swap(&intA, &intB);
    printf("After Swap function \n");
    printf("Number one x = %d\n", intA);
    printf("Number two y = %d\n", intB);
}

  》》》 使用[整型类型]的形参

/**
    调换两数
    Swap 函数参数非 指针 或 引用 类型,在这种情况下,如果需要调换两数
    仍然需要使用指针实现。
    首先在主函数中获取对应两数的存储地址,然后进行转换操作,以符合
    Swap 函数的类型需求。然后再进入 Swap 函数后,进行语义转换,将
    对应的取值转换为指针类型进行操作。
**/
#include <stdio.h>

void
Swap(int x, int y)
{
    printf("In Swap function, and before swap x = %d, y = %d\n", *((int*)x), *((int*)y));

    int tmp;
    int* pX = (int*)x;
    int* pY = (int*)y;

    tmp = *pX;
    *pX = *pY;
    *pY = tmp;

    printf("In Swap function, and after swap x = %d, y = %d\n", *pX, *pY);
}

int
main(void)
{
    int x = 23, y = 16;

    // 进入 Swap 函数之前,两数取值分别为
    printf("Before swap x = %d, y = %d\n", x, y);
    // 进入 Swap 函数之前,两数的地址分别为
    printf("Before swap &x = %d, &y = %d\n", (int)&x, (int)&y);
    Swap((int)&x, (int)&y);
    printf("After swap x = %d, y = %d\n", x, y);
    printf("After swap &x = %d, &y = %d\n", (int)&x, (int)&y);
}

  Swap 函数的交换功能实际并不需要第三个变量就可以实现。下面的两种解法就给出了提示。

  》》》 使用 [XOR][^] 进行变量的交换

/**
    调换两数
    Swap 函数参数非 指针 或 引用 类型,在这种情况下,如果需要调换两数
    仍然需要使用指针实现。
    首先在主函数中获取对应两数的存储地址,然后进行转换操作,以符合
    Swap 函数的类型需求。然后再进入 Swap 函数后,进行语义转换,将
    对应的取值转换为指针类型进行操作。
**/
#include <stdio.h>

void
Swap(int x, int y)
{
    printf("In Swap function, and before swap x = %d, y = %d\n", *((int*)x), *((int*)y));

    *((int*)x) = *((int*)x) ^ *((int*)y);
    *((int*)y) = *((int*)x) ^ *((int*)y);
    *((int*)x) = *((int*)y) ^ *((int*)x);

    printf("In Swap function, and after swap x = %d, y = %d\n", *((int*)x), *((int*)y));
}

int
main(void)
{
    int x = 23, y = 16;

    // 进入 Swap 函数之前,两数取值分别为
    printf("Before swap x = %d, y = %d\n", x, y);
    // 进入 Swap 函数之前,两数的地址分别为
    printf("Before swap &x = %d, &y = %d\n", (int)&x, (int)&y);
    Swap((int)&x, (int)&y);
    printf("After swap x = %d, y = %d\n", x, y);
    printf("After swap &x = %d, &y = %d\n", (int)&x, (int)&y);
}

  》》》 使用 [+][-] 进行变量的交换

/**
    调换两数
    Swap 函数参数非 指针 或 引用 类型,在这种情况下,如果需要调换两数
    仍然需要使用指针实现。
    首先在主函数中获取对应两数的存储地址,然后进行转换操作,以符合
    Swap 函数的类型需求。然后再进入 Swap 函数后,进行语义转换,将
    对应的取值转换为指针类型进行操作。
**/
#include <stdio.h>

void
Swap(int x, int y)
{
    printf("In Swap function, and before swap x = %d, y = %d\n", *((int*)x), *((int*)y));

    *((int*)x) = *((int*)x) + *((int*)y);
    *((int*)y) = *((int*)x) - *((int*)y);
    *((int*)x) = *((int*)x) - *((int*)y);

    printf("In Swap function, and after swap x = %d, y = %d\n", *((int*)x), *((int*)y));
}

int
main(void)
{
    int x = 23, y = 16;

    // 进入 Swap 函数之前,两数取值分别为
    printf("Before swap x = %d, y = %d\n", x, y);
    // 进入 Swap 函数之前,两数的地址分别为
    printf("Before swap &x = %d, &y = %d\n", (int)&x, (int)&y);
    Swap((int)&x, (int)&y);
    printf("After swap x = %d, y = %d\n", x, y);
    printf("After swap &x = %d, &y = %d\n", (int)&x, (int)&y);
}

 


使用 C++ 语言描述的解法


  》》》 使用 [C++ 引用类型] 作为形参

/**
    使用引用参数
**/
#include <iostream>
using namespace std;

void
Swap(int &x, int &y)
{
    cout << "In Swap function, and before swap x = "
         << x << ", " << "y = " <<  y << endl;

    x = x ^ y;
    y = x ^ y;
    x = y ^ x;

    cout << "In Swap function, and after swap x = "
         << x << ", " << "y = " << y << endl;
}

int
main(void)
{
    int x = 23, y = 16;

    // 进入 Swap 函数之前,两数取值分别为
    cout << "Before swap x = " << x << ", y = " << y << endl;
    Swap(x, y);
    cout << "After swap x = " << x << ", y = " << y << endl;
}