Is there a built in swap function in C?

前端 未结 11 2170
北恋
北恋 2020-12-15 16:01

Is there any built in swap function in C which works without using a third variable?

11条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-12-15 16:19

    I believe I've come up with a type-agnostic function for swapping any two values in standard C, though since I'm fairly new to the language I may have overlooked something. It uses the XOR swap algorithm, and I'm sure it could be optimized more, but it works as long as the two values point to the same number of bytes, specified by the 3rd argument:

    void swapn(void *a, void *b, size_t n) {
        if (a == b) {
            return;
        }
    
        size_t i;
        char *x = (char *)a,
            *y = (char *)b;
    
        for (i = 0; i < n; i++) {
            *x ^= *y;
            *y ^= *x;
            *x ^= *y;
            x++;
            y++;
        }
    }
    

    Example usage:

    // swap two integers
    int x = 5,
        y = 30;
    
    printf("%d\t%d\n", x, y);
    
    swapn(&x, &y, sizeof(int));
    
    printf("%d\t%d\n\n", x, y);
    
    // swap two floats
    float a = 9.23f,
        b = 6.83f;
    
    printf("%.2f\t%.2f\n", a, b);
    
    swapn(&a, &b, sizeof(float));
    
    printf("%.2f\t%.2f\n\n", a, b);
    
    // swap two doubles
    double p = 4.7539,
        q = 0.9841;
    
    printf("%.4f\t%.4f\n", p, q);
    
    swapn(&p, &q, sizeof(double));
    
    printf("%.4f\t%.4f\n\n", p, q);
    
    // swap two chars
    char m = 'M',
        n = 'n';
    
    printf("%c\t%c\n", m, n);
    
    swapn(&m, &n, sizeof(char));
    
    printf("%c\t%c\n\n", m, n);
    
    // swap two strings of equivalent length
    char s[] = "Hello",
        t[] = "World";
    
    printf("%s\t%s\n", s, t);
    
    swapn(s, t, sizeof(s));
    
    printf("%s\t%s\n\n", s, t);
    

    The output is:

    5   30
    30  5
    
    9.23    6.83
    6.83    9.23
    
    4.7539  0.9841
    0.9841  4.7539
    
    M   n
    n   M
    
    Hello   World
    World   Hello
    

提交回复
热议问题