Implementare la funzione di scambio in C

Jinku Hu 12 ottobre 2023
  1. Usa la variabile temporanea per implementare la funzione di scambio in C
  2. Utilizzare operazioni aritmetiche per implementare la funzione di scambio in C
  3. Utilizzare l’operazione XOR bit per bit per implementare la funzione di scambio in C
  4. Usa operazioni XOR bit per bit e macro per implementare la funzione di scambio in C
Implementare la funzione di scambio in C

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);
}
Autore: 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