Punct și virgulă după if sau for: de ce strică logica
Recunoaște instrucțiunea vidă după if, for sau while. Urmărește ce corp controlează condiția și de ce indentarea nu schimbă structura programului.
În acest material
Un punct și virgulă pus imediat după if(conditie) poate încheia instrucțiunea controlată de if. Blocul scris pe linia următoare devine independent și se execută indiferent de condiție. Indentarea poate sugera altceva, dar compilatorul urmărește semnele și acoladele.
Instrucțiunea vidă este o instrucțiune
Caracterul ; poate forma singur o instrucțiune care nu face nimic. În descrierea if(x>0); urmată de afișarea lui x, if controlează această instrucțiune vidă. Afișarea nu este protejată. Pentru x=-2, ea tot se execută.
Nu elimina însă toate semnele punct și virgulă din apropierea condițiilor. Atribuirile și apelurile obișnuite se încheie cu ;. Problema este locul exact: între antetul structurii de control și corpul pe care voiai să îl controleze.
La for, repetarea poate avea un corp gol
Un for(...) ; repetă instrucțiunea vidă. Blocul următor se execută o singură dată, după terminarea buclei. Dacă variabila i a fost declarată în afara lui for, ea poate avea deja valoarea n, iar un acces a[i] din blocul următor poate ieși din domeniul valid.
Dacă i a fost declarată chiar în antet, folosirea ei după for poate produce o eroare de compilare, deoarece domeniul ei de vizibilitate s-a încheiat. Aceste două manifestări provin din aceeași greșeală de structură, dar nu produc neapărat același mesaj.
În forma if(condiție); instrucțiunea controlată este cea vidă. Blocul scris după ea este separat și rulează indiferent de condiție.Mărește schema ↗
La while, verifică progresul
Un while(x>0); cu x pozitiv și nemodificat în condiție nu ajunge niciodată la blocul următor. Atribuirea care trebuia să micșoreze x se află în afara buclei și nu poate fi executată. În acest caz observi o rulare fără sfârșit, nu doar o afișare neașteptată.
Există și bucle cu corp vid scrise intenționat, dar ele au nevoie de o condiție și un mecanism de progres clare. Pentru început, scrierea unui corp explicit între acolade face verificarea mult mai simplă.
O excepție de sintaxă: do while
Structura do { ... } while(conditie); se încheie tocmai cu punct și virgulă după condiția finală. Aici semnul face parte din forma structurii. Nu aplica mecanic regula „niciodată după while”; diferențiază bucla cu test inițial de cea cu test final.
Testează o condiție adevărată și una falsă, apoi numără câte ori se execută corpul. Folosește formatarea automată și avertismentele compilatorului pentru a observa structura, dar justifică singur ce instrucțiune aparține fiecărei condiții.
Recapitulează if și else, buclele și structura programului.
Întrebări frecvente
Ce face un punct și virgulă imediat după if?
Poate deveni instrucțiunea vidă controlată de if. Blocul de după el este atunci independent și se execută indiferent de condiție. Indentarea nu schimbă structura programului.
De ce nu se execută blocul meu la fiecare pas al unui for?
Verifică dacă există un ; imediat după antetul buclei. În acel caz, bucla poate repeta o instrucțiune vidă, iar blocul următor se execută separat după terminarea ei.
Este greșit punctul și virgula de la finalul lui do while?
Nu. Forma do { ... } while (conditie); cere acel punct și virgulă. Distinge această sintaxă de un ; accidental care înlocuiește corpul unui if, for sau while.