zoukankan      html  css  js  c++  java
  • c实现swap函数陷阱

    swap函数陷阱

    使用c实现一个交换两个数的函数,代码很简单:

    void swap(int *a, int *b)
    {
        *a ^= *b;
        *b ^= *a;
        *a ^= *b;
    }
    

    只有3行代码,且没有引入中间变量,使用了位运算,效率高!

    但一个明显的缺陷是没有检查空指针,于是代码修正为:

    void swap(int *a, int *b)
    {
        if (a == NULL || b == NULL)
            return;
        *a ^= *b;
        *b ^= *a;
        *a ^= *b;
    }
    

    似乎这样就完美了?

    看看以下代码:

    static int count = 0;
    void permutation(int *a, int from, int to)
    {
        if (from == to) {
            cout << ++count << ":";
            for (int i = 0; i <= to; ++i)
                cout << a[i] << " ";
            cout << endl;
            return;
        }
        for (int i = from; i <= to; ++i) {
            swap(&a[from], &a[i]);
            permutation(a, from + 1, to);
            swap(&a[from], &a[i]);
        }
    }
    

    以上代码功能很简单,使用递归的方式输出数组的全排列,核心算法肯定是没有问题的。可是运行以上代码,输出大量的0!!

    why ?

    答案在于swap函数还没有考虑当a,b是同一个指针的情况,当a == b时, *a ^= *b,结果必然为0,因此结果为*a == *b == 0,
    因此正确的swap函数应该是这样的:

    void swap(int* a, int* b)
    {
        if (a == NULL || b == NULL || a == b)
            return;
        *a ^= *b;
        *b ^= *a;
        *a ^= *b;
    }
    
  • 相关阅读:
    基本概念和术语
    Html中的<label>标签
    shell17echo打印带颜色的文字
    shell-15 &的三种不同
    shell-14 多个命令以分号隔开
    shell-13 tee管道可以重定向但是不截流
    shell-12实用cat完成文件复制
    shell-11输入内容到文件
    shell-10kill杀死作业号和进程号
    shell-9前后台切换
  • 原文地址:https://www.cnblogs.com/int32bit/p/5310493.html
Copyright © 2011-2022 走看看