Răspuns pe scurt
Salvează a în aux, copiază b în a, apoi aux în b. După cele trei instrucțiuni, cele două variabile int distincte au valorile schimbate între ele.
Salvează prima valoare înainte să o înlocuiești: int aux = a; a = b; b = aux;. Cele trei instrucțiuni schimbă între ele valorile a două variabile int distincte.
De ce ai nevoie de aux? Pornește cu a=4 și b=9 și urmărește ce se întâmplă dacă sari peste salvare. Exemplul este pentru primele lecții de algoritmi și C++, când înveți atribuirea.
La primul rând se pierde valoarea 4
a = b;
b = a;
După a = b;, în a ai 9. Și b conține tot 9. Următorul rând citește așa cum sunt variabilele acum: b = a; copiază tot 9 în b. Ai obținut 9 9, deși voiai 9 4.
În cazul celor două variabile int, = scrie în variabila din stânga valoarea curentă din dreapta. Această înlocuire este descrisă în secțiunea despre atribuire din proiectul standardului C++. Programul nu păstrează automat vechiul a pentru rândul următor.
Aux păstrează ce urmează să ștergi
Salvarea vine înainte de a = b;. O scriem într-o variabilă de același tip:
int aux = a;
a = b;
b = aux;
Pentru valorile 4 și 9, tabelul arată starea după fiecare instrucțiune:
| Moment | a | b | aux |
|---|---|---|---|
| Înainte de schimb | 4 | 9 | încă nedeclarată |
| După int aux = a; | 4 | 9 | 4 |
| După a = b; | 9 | 9 | 4 |
| După b = aux; | 9 | 4 | 4 |
La mijlocul schimbului, a și b sunt egale. Uită-te însă la aux: valoarea 4 este încă acolo. Ultimul rând o pune în b.
Rulează schimbul într-un program complet
#include <iostream>
int main() {
int a, b;
std::cin >> a >> b;
int aux = a;
a = b;
b = aux;
std::cout << a << ' ' << b << '\n';
}
Introdu două numere întregi care încap în int. Pentru intrarea 4 9, vei vedea 9 4. Încearcă apoi -3 8: rezultatul trebuie să fie 8 -3.
Dacă folosești std::swap
Funcția std::swap din biblioteca standard schimbă valorile celor două argumente. Pentru variabilele int din program, adaugă #include <utility> lângă iostream și înlocuiește cele trei rânduri ale schimbului cu:
std::swap(a, b);
Într-o temă care cere explicit variabilă auxiliară, scrie varianta cu aux. Dacă lucrezi la înțelegerea atribuirii, tabelul rămâne util chiar și după ce ai învățat funcția.
Poți găsi rândul greșit fără să rulezi?
Cineva mută salvarea mai jos și scrie:
a = b;
int aux = a;
b = aux;
Cu a=4 și b=9, ce se salvează în aux? Răspunsul este 9: salvarea a venit prea târziu. Refă tabelul pe hârtie și mută rândul care păstrează valoarea 4 înainte ca aceasta să fie înlocuită.
Poți repeta această verificare fără rezolvarea în față pe alte date. Pentru un alt exemplu în care ai nevoie de o copie, urmărește rolurile lui n și m în tutorialul despre extragerea cifrelor în C++.