Implementar Função Swap em C

Jinku Hu 12 outubro 2023
  1. Use a variável temporária para implementar a função de troca em C
  2. Use operações aritméticas para implementar a função de troca em C
  3. Use a operação bit a bit XOR para implementar a função de troca em C
  4. Use operação XOR bit a bit e macros para implementar a função de troca em C
Implementar Função Swap em C

Este artigo irá explicar vários métodos de como implementar a função de troca em C.

Use a variável temporária para implementar a função de troca em C

A função de troca é uma operação típica para conduzir em variáveis. Não existe uma função de biblioteca padrão C que forneça o recurso como C++ tem a função std::swap. Neste artigo, implementamos funções de troca para valores integrais; a saber, a maioria deles aceita argumentos de tipo long int, mas sempre é possível definir vários protótipos para diferentes tipos e garantir recursos genéricos usando expansões de macro. O exemplo a seguir demonstra a função de troca usando a variável temporária. Observe que, embora seja a implementação mais fácil, esta é relativamente a versão mais rápida entre outras listadas abaixo (quando as otimizações do compilador são usadas).

#include <stdio.h>
#include <stdlib.h>

void swap(long *x, long *y) {
  long tmp = *x;
  *x = *y;
  *y = tmp;
}

int main(int argc, char *argv[]) {
  if (argc != 3) {
    printf("Usage: ./program first_number second_number/n");
    return 1;
  }

  long x = strtol(argv[1], NULL, 0);
  long y = strtol(argv[2], NULL, 0);

  printf("x:%ld, y:%ld\n", x, y);
  if (x != y) swap(&x, &y);
  printf("x:%ld, y:%ld\n\n", x, y);

  exit(EXIT_SUCCESS);
}

Comando de amostra:

./program 123 432

Resultado:

x:123, y:432
x:432, y:123

Use operações aritméticas para implementar a função de troca em C

Alternativamente, pode-se implementar uma função de troca usando apenas operações de adição e subtração. Operamos ponteiros passados ​​na função, modificando os valores dos argumentos diretamente. Na função main, existe uma condição if antes da função swap ser chamada para evitar a chamada quando os operandos são iguais.

#include <stdio.h>
#include <stdlib.h>

void swap(long *x, long *y) {
  *x = *x + *y;
  *y = *x - *y;
  *x = *x - *y;
}

int main(int argc, char *argv[]) {
  if (argc != 3) {
    printf("Usage: ./program first_number second_number/n");
    return 1;
  }

  long x = strtol(argv[1], NULL, 0);
  long y = strtol(argv[2], NULL, 0);

  printf("x:%ld, y:%ld\n", x, y);
  if (x != y) swap(&x, &y);
  printf("x:%ld, y:%ld\n\n", x, y);

  exit(EXIT_SUCCESS);
}

Use a operação bit a bit XOR para implementar a função de troca em C

A implementação mais complicada e um pouco complicada da função de troca é onde a operação XOR bit a bit é usada. Observe que esta versão não precisa de uma terceira variável como o exemplo anterior. A princípio, armazenamos o resultado XOR-ed dos inteiros fornecidos em um de seus locais. Então, XOR o valor armazenado (y) com o outro inteiro e armazenamos o resultado no lugar deste último. Finalmente, ambas as variáveis ​​são XOR-ed mais uma vez, e o resultado é armazenado na primeira variável modificada - y neste caso. Esta implementação envolve mais instruções de código de máquina quando compiladas sem sinalizadores de otimização, portanto, produz uma solução mais intensiva de computação.

#include <stdio.h>
#include <stdlib.h>

void swap(long *x, long *y) {
  *y = *x ^ *y;
  *x = *x ^ *y;
  *y = *x ^ *y;
}

int main(int argc, char *argv[]) {
  if (argc != 3) {
    printf("Usage: ./program first_number second_number/n");
    return 1;
  }

  long x = strtol(argv[1], NULL, 0);
  long y = strtol(argv[2], NULL, 0);

  printf("x:%ld, y:%ld\n", x, y);
  if (x != y) swap(&x, &y);
  printf("x:%ld, y:%ld\n\n", x, y);

  exit(EXIT_SUCCESS);
}

Use operação XOR bit a bit e macros para implementar a função de troca em C

Conforme demonstrado no exemplo anterior, a função de troca XOR também pode ser implementada como uma macro semelhante a uma função. Observe que é necessário verificar se os dois operandos são o mesmo objeto; caso contrário, a macro atribui zero ao objeto, o que resulta na saída incorreta. Esta verificação é implementada usando ?: Condicional, e só então executamos o algoritmo de troca XOR semelhante à implementação anterior. Lembre-se, porém, de que esta macro semelhante a uma função só pode processar valores integrais.

#include <stdio.h>
#include <stdlib.h>

#define XORSWAP(a, b) \
  ((&(a) == &(b)) ? (a) : ((a) ^= (b), (b) ^= (a), (a) ^= (b)))

int main(int argc, char *argv[]) {
  if (argc != 3) {
    printf("Usage: ./program first_number second_number/n");
    return 1;
  }

  long x = strtol(argv[1], NULL, 0);
  long y = strtol(argv[2], NULL, 0);

  printf("x:%ld, y:%ld\n", x, y);
  XORSWAP(x, y);
  printf("x:%ld, y:%ld\n", x, y);

  exit(EXIT_SUCCESS);
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook