Oregon ha scritto:
x = x ^ y
y = x ^ y
x = x ^ y
La versione coi più e i meno l'ho capita al volo, questa devo dire che mi impegna ben di più! Proverò a fare un programmino di test e a vedere come opera il meccanismo (che, almeno per ora, non ho capito). A parte che basterebbe anche un foglietto di carta e una matita, per fare le prove...
Una cosa: per usare questa versione occorre assicurarsi che tutti gli operatori siano dello stesso tipo, vero? Nel senso: sarebbe rischioso se x fosse un int e y un char? E ancora, si possono "mischiare" impunemente tipi con segno e senza segno? Le conversioni automatiche possono fare sfracelli? Cautele?
=========
Per il "rovesciamento" di un vettore in genere si trovano soluzioni di questo tipo (qui per una stringa C
zero terminated, ma è facile adattare il codice affinché usi vettori d'altra natura).
/*==============================================================================
Riceve, tramite il parametro s, un puntatore ad una stringa "zero terminated" e
la "rovescia" in loco invertendone l'ordine dei caratteri.
Restituisce lo stesso puntatore ricevuto tramite il parametro s.
==============================================================================*/
char *agnirts( char *s ) {
if( NULL != s ) { /* s deve essere un puntatore valido */
long i, l, lMezzi;
char *p, aux;
for( p=s; *p; ++p ); l=p-s; /* ricava la lunghezza della stringa */
/* inverte l'ordine dei caratteri nella stringa */
for( lMezzi=l/2, i=0; i<lMezzi; ++i ) {
aux = s[i];
s[i] = s[l-i-1];
s[l-i-1] = aux;
}
}
return s;
}
Con un vettore di int l'opzione
zero terminated è sconsigliabile, per cui serve un parametro in più che comunichi la quantità degli elementi contenuti nel vettore stesso, in questo caso dim_v.
/*==============================================================================
Riceve, tramite il parametro v, un puntatore ad un vettore di interi e lo
"rovescia" in loco invertendone l'ordine degli elementi.
Restituisce lo stesso puntatore ricevuto tramite il parametro v.
==============================================================================*/
int *erottev( int *v, unsigned int dim_v ) {
if( NULL != v ) { /* v deve essere un puntatore valido */
unsigned int i, vMezzi;
int *p, aux;
/* inverte l'ordine dei caratteri nel vettore */
for( vMezzi=v/2, i=0; i<vMezzi; ++i ) {
aux = v[i];
v[i] = v[dim_v-i-1];
v[dim_v-i-1] = aux;
}
}
return s;
}
Di cose così è pieno il web (e i libri di testo).