Ci sono tantissimi errori nel tuo codice. In effetti è praticamente tutto sbagliato.
1. Partiamo dal prototipo della funzione
scambio. L'hai dichiarata come una funzione che restituisce un singolo valore intero a partire da due argomenti interi. Ci sono già due errori qui. Il primo è che sembri voler restituire due valori, ma il C non lo permette. Sarebbe quindi stato piuttosto necessario usare una struttura per agglomerare questi due valori. Tuttavia non è quello che una funzione di scambio dovrebbe fare. Quello che vuoi fare è scambiare il valore contenuto nelle due locazioni di memoria corrispondenti agli argomenti passati, non restituire i due valori scambiati. È insomma necessario passare gli argomenti per riferimento e non per copia come nel tuo caso. In C si usano i puntatori. Il prototipo della tua funzione avrebbe insomma dovuto avere la forma:
- Codice:
void scambio(int * x, int * y);
2. A questo punto è necessario fare una piccola parentesi sull'operatore
, (la virgola) in C. Questo operatore "esegue" l'espressione alla sua sinistra e restituisce quella a destra. Il seguente codice restituisce insomma semplicemente
y.
- Codice:
// il seguente è uguale a "return y"
return x, y;
3. Non mi è chiaro perché stai usando l'operatore XOR per lo scambio delle variabili. È MOLTO meno leggibile (devi più o meno già conoscere il trucco per poterlo comprendere a prima vista) e non è più efficiente. Questo genere di "ottimizzazioni" lasciale al compilatore se le ritiene necessarie.
4. La stringa di formato del
printf richiede il passaggio di due argomenti interi, ma stai passando solo il valore restituito da
scambio. Se anche la funzione restituisse in qualche modo più di un valore (tramite una struttura per esempio) non potresti comunque passare tali valori al printf in questo modo. Quello che andava fatto era scrivere:
- Codice:
scambio(&a, &b);
printf("a: %d, b: %d\n", a, b);