2012-02-04 19 views
9
void swap(int &first, int &second){ 
    int temp = first; 
    first = second; 
    second = temp; 
} 

//////Out parametri in C

int a=3,b=2; 
swap(a,b); 

Nell'esempio sopra, gli addebiti C compilatore che "void swap (int & primo, int & secondo)" ha un errore di sintassi . come mancante "&" prima "(/ {"

non capisco perché non supporta questa funzione C

+1

Oppure si potrebbe usare lo swap XOR :) '* prima *^= secondo, * secondo^= * prima, * first^= * second; ' –

+0

Ti dispiace usare #define? se è così allora scambia (a, b) b^= a; a^= b; b^= a; – QuentinUK

+10

Gli scambi XOR e simili appartengono al IOCCC, non nel codice reale o come consiglio ai principianti. –

risposta

12

C non supporta il passaggio per riferimento. Quindi, è necessario utilizzare i puntatori a fare ciò che si sta cercando di ottenere:

void swap(int *first, int *second){ 
    int temp = *first; 
    *first = *second; 
    *second = temp; 
} 


int a=3,b=2; 
swap(&a,&b); 

faccio NON raccomandano questo: Ma io aggiungo per completezza.

È possibile utilizzare una macro se i parametri non hanno effetti collaterali.

#define swap(a,b){ \ 
    int _temp = (a); \ 
    (a) = _b;  \ 
    (b) = _temp;  \ 
} 
21

C non supporta il passaggio per riferimento;?? t hat è una funzionalità in C++. Dovrai passare invece i puntatori.

void swap(int *first, int *second){ 
    int temp = *first; 
    *first = *second; 
    *second = temp; 
} 

int a=3,b=2; 
swap(&a,&b); 
0

per intero di swap è possibile utilizzare questo metodo senza una variabile locale:

int swap(int* a, int* b) 
{ 
    *a -= *b; 
    *b += *a; 
    *a = *b - *a; 
} 
+0

Dovrebbe essere 'void swap (int * a, int * b)' per evitare il 'warning: il controllo raggiunge la fine della funzione non void' (non fa mai male controllare 'if (* a! = * b) 'prima di scambiare ...) –