ALGO25 / BLOG

Diferența dintre = și == într-un if C++

Separă atribuirea de comparația de egalitate în condițiile C++. Urmărește modificarea variabilei, conversia la bool și testele care expun eroarea.

x=5 scrie valoarea 5 în x. x==5 compară valoarea curentă a lui x cu 5 și produce adevărat sau fals. Diferența unui singur caracter devine greu de observat într-un if, deoarece o atribuire poate fi și ea o expresie validă în condiție.

Ce face if cu o valoare numerică

Într-o condiție, zero este interpretat ca fals, iar o valoare numerică nenulă ca adevărat. Dacă scrii if(x=5), modifici x la 5, apoi condiția devine adevărată. Nu ai întrebat dacă valoarea inițială era 5.

Dacă înlocuiești 5 cu 0, comportamentul pare complet diferit: if(x=0) modifică x la zero și nu execută ramura adevărată. Aceste două exemple explică de ce eroarea poate părea „if-ul intră mereu” sau „if-ul nu intră niciodată”. Cauza comună este atribuirea din condiție.

Trasează și valoarea de după if

Pornește cu x=3. După verificarea corectă x==5, x rămâne 3 și condiția este falsă. După atribuirea x=5, x devine 5 și condiția este adevărată. Dacă te uiți doar la textul afișat de ramură, poți pierde faptul că datele programului au fost schimbate.

Într-o problemă cu un contor, această modificare se poate propaga: toate calculele ulterioare pornesc de la valoarea greșită. Caută prima diferență de stare, nu doar ultima linie de ieșire care nu coincide cu răspunsul așteptat.

Cu x inițial 2, expresia x=5 atribuie 5 și este adevărată ca valoare logică. Expresia x==5 doar compară și este falsă pentru x=2.Cu x inițial 2, expresia x=5 atribuie 5 și este adevărată ca valoare logică. Expresia x==5 doar compară și este falsă pentru x=2.Mărește schema ↗

Folosește avertismentele compilatorului

Un compilator poate avertiza asupra atribuirii folosite drept condiție, în funcție de opțiunile activate. Citește avertismentele chiar dacă programul produce un executabil. Compilarea reușită confirmă că sintaxa este acceptată, nu că intenția ta a fost exprimată corect.

Există cod valid care atribuie intenționat într-o condiție, dar într-o lecție de început este de obicei mai clar să separi atribuirea și verificarea. Nu adăuga paranteze doar pentru a ascunde un avertisment; stabilește întâi operația dorită.

Trei teste simple

Pentru o condiție care trebuie să accepte numai valoarea 5, testează 3, 5 și 7. Doar testul cu 5 nu diferențiază atribuirea de comparație, deoarece ambele intră în ramură. Verifică apoi că variabila își păstrează valoarea după comparație.

Ca exercițiu, explică diferența dintre x+=1, x=x+1 și x==x+1: primele două modifică x, ultima compară două expresii, presupunând calcule reprezentabile. Un semn de egalitate din matematică nu are un singur corespondent în limbajul C++.

Continuă cu operatorii, deciziile și variabilele.

Întrebări frecvente

Care este diferența dintre = și == în C++?

= atribuie o valoare și modifică operandul din stânga. == compară două valori și produce un rezultat logic, fără să facă atribuirea. Confundarea lor într-un if poate schimba datele programului.

De ce if(x=5) intră în ramură?

Mai întâi atribuie 5 lui x, apoi folosește valoarea atribuită drept condiție. Fiind nenulă, aceasta este interpretată ca adevărată. Expresia nu verifică valoarea anterioară a lui x.

Cum descopăr atribuirea accidentală dintr-o condiție?

Citește avertismentele compilatorului și testează valori diferite de cea comparată. Pentru condiția care trebuie să accepte numai 5, testele cu 3, 5 și 7 separă atribuirea de comparație.