← Înapoi la blog
Ghiduri și resurseProfesorBun.ro

Cum interschimbi două variabile în C++ fără să pierzi o valoare

De ce a=b; b=a; pierde prima valoare și cum repari schimbul cu o variabilă auxiliară. Program complet și urmărirea fiecărui pas.

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:

Momentabaux
Înainte de schimb49încă nedeclarată
După int aux = a;494
După a = b;994
După b = aux;944

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++.

Surse consultate

  1. 1.eel.is
  2. 2.eel.is

Întrebări frecvente

Răspunsuri rapide despre subiect

Pot numi variabila auxiliară temp în loc de aux?

Da. Alege un identificator valid care nu este deja folosit în acel loc și păstrează același nume la salvare și la copierea în b.

După a=b, a se actualizează automat când modific b?

Nu în exemplul cu două variabile int distincte. Se copiază valoarea curentă a lui b; modificările făcute ulterior lui b nu se transmit lui a.

De ce nu ajunge testul cu două valori egale?

Dacă pornești cu a=5 și b=5, și schimbul corect, și codul greșit afișează 5 5. Include și două valori diferite, ca să poți vedea dacă fiecare a fost păstrată.

Mai citește

Alte articole din aceeași categorie