Sunteți pe pagina 1din 11

Instructiuni

30 octombrie 2003

Utilizarea i programarea calculatoarelor. Curs 5 s

Marius Minea

Instructiuni

Instructiunile limbajului C
Instructiunea expresie expresie opt ; orice expresie, evaluat pentru efectele ei laterale; particular: a n expresii de atribuire: x = y + 1; y *= 2; --z; apel de functie (ignornd valoarea returnat): printf("salut!\n"); a a instructiunea vid a ; (expresia lipsete) s Exemplu: ciclu cu corp vid while (s[i++]); Obs: C n ; nu e separator, ci face parte din anumite instructiuni Instructiunea compus (bloc) a { lista-declaratii lista-instructiuni } grupeaz declaratiile/instructiunile din list sintactic a a ntr-o instructiune poate ncuibat (contine alte blocuri); poate vid a a { } lista-declaratii nu poate contine denitii de functii
C99 (i C++) un bloc poate contine declaratii i instructiuni orice ordine. In s n s n
Utilizarea i programarea calculatoarelor. Curs 5 s Marius Minea

Instructiuni

Instructiuni etichetate
identicator : instructiune case expresie-constant-int : instructiune a default : instructiune permit referirea la instructiune pentru un salt (explicit sau implicit). Etichetele au spatiu de nume separat de cel al identicatorilor obinuiti s (putem avea variabile/functii/etc. i etichete cu acelai nume) s s Domeniul de vizibilitate al etichetei e corpul functiei care se a n a (numele de etichete trebuie s e unice cadrul unei functii) a n Etichetele case i default pot apare doar instructiunea switch. s n Intr-o instructiune switch poate exista cel mult o etichet default a iar constantele ntregi din etichetele case vor distincte.

Utilizarea i programarea calculatoarelor. Curs 5 s

Marius Minea

Instructiuni

Instructiuni de selectie

Instructiunea if if ( expresie ) instructiune1 sau if ( expresie ) instructiune1 else instructiune2 expresia trebuie s e de tip scalar ( a ntreg, real, enumerare) dac expresia e nenul se execut instructiune1, altfel instructiune2 a a a un else e asociat ntotdeauna cu cel mai apropiat if Instructiunea switch switch ( expresie-intreag ) instructiune a se evalueaz expresia (de tip a ntreg, posibil limitat la 1023 valori) a dac corpul instructiune (compus) exist o etichet case a n a a a cu valoarea ntreag obtinut, se sare la instructiunea respectiv a a a dac nu, i exist o etichet default, se sare la acea instructiune a s a a altfel nu se execut nimic (se trece la instructiunea urmtoare) a a pt. acelai cod la mai multe etichete: case val1 : case val2 : ir-instr s s Obs: Executia nu se oprete la urmtorul case (e doar o etichet); s a a ieirea din switch: doar cu instruct. break sau la sfritul corpului! s a s permite utilizarea de cod comun pe ramuri, dar cu mare atentie!
Utilizarea i programarea calculatoarelor. Curs 5 s Marius Minea

Instructiuni

Instructiunea switch: exemplu


char c; int a, b, r; printf("Scrieti o operatie intre doi intregi: "); if (scanf("%d %c %d", &a, &c, &b) == 3) { /* toate 3 corect */ switch (c) { case +: r = a + b; break; /* iese din corpul switch */ case -: r = a - b; break; /* idem */ default: c = \0; break; /* fanion caracter eronat */ case x: c = *; /* x e tot ^nmultire, continu */ a case *: r = a * b; break; /* ca i pt.* apoi iese */ s case /: r = a / b; /* la sf^rit nu trebuie break */ a s } if (c) printf("Rezultatul: %d %c %d = %d\n", a, c, b, r); else printf("Operatie necunoscut\n"); a } else printf("Format eronat\n");
Utilizarea i programarea calculatoarelor. Curs 5 s Marius Minea

Instructiuni

Ciclurile cu test initial i nal s


Instructiunile while i do (ciclurile cu test initial i nal) s s while ( expresie ) instructiune do instructiune while ( expresie ); ambele execut instructiunea att timp ct valoarea expresiei a a a (de tip scalar) e nenul (adevrat). a a a difer momentul de evaluare a expresiei ( a nainte/dup ecare iteratie) a
Obs: Pascal, din repeat . . . until se iese pe conditie true (invers!) In

Utilizarea i programarea calculatoarelor. Curs 5 s

Marius Minea

Instructiuni

Instructiunea for
for (exp-init ; exp-test ; exp-cont) instructiune e echivalent cu: a
* exceptie: instructiunea continue, vezi ulterior

exp-init; while (exp-test) { instructiune; exp-cont; }

oricare din cele 3 expresii poate lipsi (dar cele dou ; ramn) a a dac exp-test lipsete, e tot timpul adevrat (ciclu innit) a s a a C99 (ca i C++) se permite ca expresia exp-init s e In s n a nlocuit cu a o declaratie de variabile (evtl. initializate) cu domeniu de vizibilitate ntreaga instructiune. for (int i = 0; i < 10; ++i) { /* corpul ciclului */ }

Utilizarea i programarea calculatoarelor. Curs 5 s

Marius Minea

Instructiuni

Instructiunea return

return expresie opt ; ncheie executia functiei curente returneaz valoarea expresiei date (dac este prezent) a a a Obs: ntr-o functie care nu are tipul void, ecare cale prin cod trebuie s returneze o valoare; nu e voie s se ating ultima acolad }. a a a a int pos(char s[], char c) { int i = 0; do if (s[i] == c) return i; while (s[i++]); return -1; } /* prima pozitie a lui c in s */

/* returneaz pozitia gsit */ a a a /* -1 ca fanion, nu s-a gsit */ a

main returneaz un int (succes/cod eroare) sistemului de operare; a se declar int main(void); implicit returneaz 0 (succes) a a
Utilizarea i programarea calculatoarelor. Curs 5 s Marius Minea

Instructiuni

Instructiunea break
produce ieirea din corpul instructiunii while, do, for sau switch s imediat nconjurtoare; executia continu cu instructiunea urmtoare a a a mai convenabil dect testarea unei variabile boolene la ciclul urmtor a a a mai lizibil, dac codul peste care se sare e complex a const int MAX = 20; int i, t[MAX], v; /* ... aici dm nite valori lui v i t */ a s s for (i = MAX; --i >= 0; ) /* caut pe v ^n tabloul t */ a if (t[i] == v) break; if (i == -1) printf("nu s-a gsit\n"); a else printf("gsit la pozitia %d\n", i); a

Utilizarea i programarea calculatoarelor. Curs 5 s

Marius Minea

Instructiuni

10

Instructiunea continue
produce trecerea la sfritul iteratiei a s ntr-un ciclu while, do sau for ncepnd cu testul pt. while i do, i cu expr3 (actualizare) pt. for a s s (controlul trece la punctul din ciclu de dup ultima instructiune) a la fel, cod mai lizibil, dac partea neexecutat din iteratie e complex a a a for (d = 2; ; d++) { /* descompune n > 1 ^n factori primi */ if (n % d != 0) continue; /* nu se ^mparte, urmtorul! */ a exp = 0; do /* repet de c^te ori d e factor */ a a exp++; while ((n /= d) % d == 0); printf ("%d^%d ", d, exp); /* scrie factorul curent */ if (n == 1) break; /* am terminat */ }
Utilizarea i programarea calculatoarelor. Curs 5 s Marius Minea

Instructiuni

Instructiunea goto

11

Sintaxa: goto eticheta ; Efectul: se sare la executia instructiunii cu eticheta specicat a Obs: orice instructiune poate etichetat optional a etichet : instr a instructiunea goto nu corespunde principiilor programrii structurate a de evitat: duce uor la programe dicil de eles i analizat s nt s orice program poate rescris fr folosirea lui goto a a (eventual utiliznd teste i/sau variabile boolene suplimentare) a s poate totui util, ex. pentru ieirea din mai multe cicluri s a s ncuibate while (...) { /* scriem ^ntr-un fiier, linie cu linie */ s while (...) { /* prelucrm cuvintele i spatiile din linie */ a s if (eroare_la_scriere) goto eroare; /* abandoneaz ciclurile */ a } } eroare: /* cod pt. tratarea erorii */
Utilizarea i programarea calculatoarelor. Curs 5 s Marius Minea