HOWTO · C

Implementare la funzione di scambio in C

In questo articolo viene illustrato come implementare la funzione di scambio in C

In questa pagina

Questo articolo spiegherà diversi metodi su come implementare la funzione di scambio in C.

Usa la variabile temporanea per implementare la funzione di scambio in C

La funzione di scambio è un’operazione tipica da condurre sulle variabili. Non esiste una funzione di libreria standard C che fornisce la caratteristica come C++ ha la funzione std::swap. In questo articolo, implementiamo funzioni di scambio per valori integrali; vale a dire, la maggior parte di essi richiede argomenti di tipo long int, ma è sempre possibile definire più prototipi per tipi diversi e garantire funzionalità generiche utilizzando espansioni macro. L’esempio seguente mostra la funzione di scambio utilizzando la variabile temporanea. Si noti che, anche se è l’implementazione più semplice, questa è relativamente la versione più veloce tra le altre elencate di seguito (quando vengono utilizzate le ottimizzazioni del compilatore).

#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 di esempio:

./program 123 432

Produzione:

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

Utilizzare operazioni aritmetiche per implementare la funzione di scambio in C

In alternativa, è possibile implementare una funzione di scambio utilizzando solo operazioni di addizione e sottrazione. Operiamo sui puntatori passati nella funzione, modificando quindi direttamente i valori degli argomenti. Nella funzione main, c’è una condizione if prima che la funzione swap venga chiamata per evitare l’invocazione quando gli operandi sono uguali.

#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);
}

Utilizzare l’operazione XOR bit per bit per implementare la funzione di scambio in C

L’implementazione più complicata e leggermente complicata della funzione di scambio è dove viene utilizzata l’operazione XOR bit per bit. Nota che questa versione non necessita di una terza variabile come nell’esempio precedente. All’inizio, memorizziamo il risultato XOR degli interi dati in una delle loro posizioni. Quindi XOR il valore memorizzato (y) con l’altro intero e memorizziamo il risultato al posto di quest’ultimo. Infine, entrambe le variabili vengono modificate con XOR ancora una volta e il risultato viene memorizzato nella variabile modificata per prima - y in questo caso. Questa implementazione implica più istruzioni del codice macchina quando viene compilata senza flag di ottimizzazione, quindi produce una soluzione a più alta intensità di calcolo.

#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);
}

Usa operazioni XOR bit per bit e macro per implementare la funzione di scambio in C

Come dimostrato nell’esempio precedente, la funzione di scambio XOR può essere implementata anche come macro simile a una funzione. Notare che deve essere verificato se i due operandi sono lo stesso oggetto; in caso contrario, la macro assegna zero all’oggetto, il che risulta nell’output errato. Questo controllo è implementato usando ?: Condizionale, e solo allora eseguiamo l’algoritmo di scambio XOR simile all’implementazione precedente. Tieni presente, tuttavia, che questa macro simile a una funzione può elaborare solo valori integrali.

#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);
}