Cărui if îi aparține else? Acoladele în C++
Înțelege asocierea lui else într-un if imbricat. Urmărește condițiile separat și folosește acolade ca să exprimi exact ramura dorită.
În acest material
Când două instrucțiuni if sunt imbricate fără acolade, un else se asociază cu cel mai apropiat if anterior care nu are deja else. Spațiile și indentarea nu schimbă această regulă. O formatare înșelătoare poate face programul să pară corect la o lectură rapidă.
Două decizii, două întrebări
Imaginează-ți verificarea „dacă x este pozitiv, atunci dacă x este par, afișează A, altfel afișează B”. Fără alte acolade, acel „altfel” privește paritatea, adică if-ul interior. Pentru x=3 afișezi B. Pentru x=-3 nu afișezi nimic, deoarece nu intri în prima condiție.
Dacă intenția era să afișezi B pentru orice număr nepozitiv, else trebuie să aparțină if-ului exterior. Grupezi întregul if interior într-un bloc între acolade, închei acel bloc și abia apoi scrii else. Acum x=-3 ajunge în ramura B, iar x=3 poate să nu afișeze nimic, în funcție de corpul interior.
Un tabel de cazuri clarifică intenția
Folosește trei valori: 2,3,-3. Ele separă cazul pozitiv par, pozitiv impar și negativ. Pentru prima interpretare, rezultatele sunt A,B,nimic. Pentru a doua interpretare descrisă, sunt A,nimic,B. Un singur test cu 2 nu poate descoperi asocierea greșită.
Adaugă și zero dacă prima condiție este x>0. Zero intră în ramura „nu este pozitiv”, nu în cea „este negativ”. Formularea textului afișat trebuie să corespundă exact condiției, altfel programul poate avea structură corectă și mesaj fals.
Fără acolade, în if(A) if(B) X; else Y;, ramura else aparține lui if(B). Când A este fals, nici X, nici Y nu rulează.Mărește schema ↗
Acoladele fac structura vizibilă
Scrierea acoladelor și pentru un corp de o singură instrucțiune reduce riscul ca o linie adăugată ulterior să ajungă în afara ramurii. Formatarea automată ajută să observi structura reală, dar nu decide în locul tău cărei condiții trebuia să îi aparțină alternativa.
Nu încerca să repari problema numai schimbând ordinea liniilor sau numărul spațiilor. Marchează întâi, pe hârtie, fiecare pereche if–else și blocul controlat de ea. Apoi compară această structură cu cele trei cazuri concrete.
Continuă cu structura de decizie, operatorii logici și structura unui program. Asocierea este descrisă în specificația instrucțiunii if.
Întrebări frecvente
Cu ce if se asociază un else fără acolade?
Cu cel mai apropiat if anterior care nu are deja un else, conform structurii sintactice. Indentarea poate sugera altceva, dar nu schimbă asocierea.
Cum fac un else să aparțină condiției exterioare?
Grupează explicit blocul interior cu acolade, apoi scrie ramura else a condiției exterioare după acel bloc. Verifică separat cazul în care condiția exterioară este falsă.
Care este diferența dintre două if-uri și if urmat de else if?
Două instrucțiuni if independente pot executa ambele ramuri. Într-un lanț if și else if, după prima condiție adevărată nu mai sunt evaluate ramurile următoare ale lanțului.