• Non ci sono risultati.

Linguaggio C Espressioni e operatori

N/A
N/A
Protected

Academic year: 2021

Condividi "Linguaggio C Espressioni e operatori"

Copied!
7
0
0

Testo completo

(1)

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 1

FONDAMENTI DI INFORMATICA

Prof. PIER LUCA MONTESSORO Ing.DAVIDE PIERATTONI

Facoltà di Ingegneria Università degli Studi di Udine

Linguaggio C Espressioni e operatori

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 2 Questo insieme d i trasparenze ( detto nel seguito slide) è protetto dalle leggi sul copyright e dalle disposizioni dei trattati internazionali. Il titolo ed i copyright relativi alle slides (ivi inclusi , ma non limitatamente, ogni immagine, fotografia, animazione , video, audio, musica e testo) sono d i proprietà degli autori prof . Pier Luca Montessoro e ing. Davide Pierattoni, Università degli Studi di Udine.

Le slide possono essere riprodotte ed utilizzate liberamente dagli istituti di ricerca , scolastici ed universitari afferenti a l Ministero della Pubblica Istruzione e al Ministero dell’Università e Ricerca Scientifica e Tecnologica , per scopi istituzionali, non a fine di lucro . In tal caso non è richiesta alcuna autorizzazione .

Ogni altro utilizzo o riproduzione (ivi incluse , ma non limitatamente, le riproduzioni su supporti magnetici , su reti d i calcolatori e stampe) in toto o in parte è vietata, se non esplicitamente autorizzata per iscritto, a priori, da parte degli autori.

L’informazione contenuta in queste slide è ritenuta essere accurata alla data della pubblicazione . Essa è fornita per scopi meramente didattici e non per essere utilizzata in progetti d i impianti, prodotti, reti, ecc. In ogni caso essa è soggetta a cambiamenti senza preavviso. Gli autori non assumono alcuna responsabilità per il contenuto d i queste slide (ivi incluse, ma non limitatamente , la correttezza, completezza, applicabilità, aggiornamento dell’informazione ).

In ogni caso non può essere dichiarata conformità all’informazione contenuta in queste slide.

In ogni caso questa nota di copyright e il suo richiamo in calce ad ogni slide non devono mai essere rimossi e devono essere riportati anche in utilizzi parziali.

Nota di Copyright

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 3

Operatori ed espressioni

• I programmi hanno lo scopo di eseguire operazioni sui dati

• Il linguaggio C offre una serie di operatori:

– aritmetici – relazionali – logici

– di assegnazione

– di incremento e decremento – bit a bit (“bitwise”)

Gli operatori che richiedono due operandi si dicono binari; alcuni operatori, detti unari, agiscono invece su un unico operando

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 4

Espressioni

• Un’espressione è una combinazione di operatori e relativi operandi

• Nella forma più semplice, un’espressione è priva di operatori; in tal caso corrisponde a:

3.14 ê una costante x ê il valore di una variabile calcola_valore(x, y)

ê una funzione definita dall’utente sin(x) ê una funzione di libreria

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 5

Espressioni

• Nella sua forma più complessa, un’espressione può comprendere uno o più operatori e relativi operandi

(2+i) * (2-i)

• Se nell’espressione compaiono più operatori, questi sono soggetti a delle precise regole di precedenza

• L’espressione aritmetica precedente corrisponde ad esempio al prodotto tra le due espressioni (2+i) e (2-i), mentre:

2+i*2-i corrisponde a (2+(i*2)) - i

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 6

Operatori aritmetici

• Gli operatori aritmetici disponibili in C sono:

+ somma - sottrazione

* moltiplicazione / divisione

% modulo (resto della divisione intera)

• L’operatore di divisione applicato a due interi restituisce la parte intera del quoziente (es. 5/2 ê 2)

• L’operatore % fornisce il resto della divisione tra due operandi interi: 5%2 ê 1

• Nel caso di operandi reali: 5.0/2.0 ê 2.5 (se un operando è reale e l’altro intero, quello intero viene “promosso” a reale)

(2)

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 7

Operatori aritmetici

• Sono possibili più operazioni in sequenza

• In tale caso:

ä *, / e % hanno la precedenza su + e - ä l’associatività vale da sinistra verso destra

Quindi 6 + 3 * 4 / 3 + 2 corrisponde a...

(6 + ((3*4)/3)) + 2 é 12é

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 8

Operatore cast

• In qualsiasi espressione è possibile forzare delle conversioni di tipo, mediante l’operazione unaria di cast

• Nel costrutto generico

(nome_del_tipo) espressione l’espressione viene convertita nel tipo specificato, secondo precise regole di corrispondenza tra i tipi

• Ad esempio, se j è un intero, l’espressione (4 /(float) j)

converte “al volo” il valore della variabile j in reale e quindi forza l’esecuzione della divisione tra numeri reali

• Il linguaggio applica delle regole di conversione automatica; è tuttavia consigliabile indicare

esplicitamente tutte le conversioni di cui non si è certi!

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 9

Operatori aritmetici unari

• Gli operatori aritmetici + e - possono essere utilizzati anche come operatori unari:

-i +i a + (-x) -(2*y) + x

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 10

Operatori relazionali

• Permettono il confronto di coppie di valori tra loro omogenei (dello stesso tipo)

• Generano un risultato logico (vero o falso)

• Sono spesso usati come condizioni di controllo dell’esecuzione di un programma

• Essi sono:

> maggiore

>= maggiore o uguale

< minore

<= minore o uguale

== uguale

!= diverso

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

Vero e falso

• In C un’espressione è:

– VERA se assume un valore diverso da zero

– FALSA se assume il valore zero

NOTA: normalmente non è necessario che il

0 = falso ≠ 0 = vero

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

Esempi di espressioni relazionali

• Il risultato di un’espressione relazionale è un valore logico vero o falso

• Se i = 5 e j = 7, allora:

i > j i < j i >= j i <= j i == j i != j

é è falsa

é è falsa é è vera é è falsa é è vera é è vera

(3)

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 13

Esempi di espressioni relazionali

• Gli operatori relazionali hanno precedenza inferiore rispetto agli operatori aritmetici, e associatività da sinistra verso destra

var_1 == var_2 + 1

ê corrisponde all’espressione var_1==( var_2 + 1)

a + b != i

ê corrisponde a (a+b) != i

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 14

Operatori logici

• A questa categoria appartengono gli operatori booleani:

&& AND logico

|| OR logico

! NOT logico (unario)

• Gli operatori && e || hanno precedenza inferiore agli operatori aritmetici e agli operatori relazionali;

l’associatività vale da sinistra a destra

• L’operatore && ha precedenza maggiore rispetto a ||

• L’operatore ! ha precedenza maggiore rispetto agli operatori aritmetici, relazionali, all’ AND e all’OR logici;

per esso l’associatività vale da destra a sinistra

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 15

Operatori logici: AND

A B U

F F F

F V F

V F F

V V V

U = A && B

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 16

Operatori logici: AND

A && B è falsa se almeno un operando è falso A && B è vera se tutti gli

operandi sono veri

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 17

Operatori logici: OR

A B U

F F F

F V V

V F V

V V V

U = A || B

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 18

Operatori logici: OR

A || B è falsa se tutti gli operandi sono falsi A || B è vera se almeno un

operando è vero

(4)

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 19

Operatori logici: NOT

A U

F V

V F

U = !A

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 20

Operatori logici

• L’operatore ! di negazione logica restituisce:

un valore diverso da zero, quando l’operando vale 0 (nel caso di un intero) oppure 0.0 (nel caso di un floating-point)

zero, se l’operando ha valore diverso da zero

• È frequente trovare l’operatore ! in espressioni condizionali del tipo:

if (!espressione) istruzioni

nel qual caso il blocco di istruzioni verrà eseguito solo l’espressione è falsa

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 21

Operatori di assegnazione

• La sintassi dell’operatore di assegnazione è:

nome_variabile = espressione Alla variabile a sinistra dell’operatore '=' viene assegnato il risultato o il valore dell’espressione a destra

• Esempi:

z = 2 * y - 1;

x = z - 3;

assegno a z il valore 2*y - 1...

…e poi assegno a x il valore z - 3 Un’assegnazione è di per sé un’espressione con un proprio risultato, e quindi le istruzioni precedenti equivalgono a scrivere:

x = (z = 2*y -1) - 3;

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 22

Operatori di assegnazione

• Un caso particolare è l’assegnazione multipla, che permette di assegnare lo stesso valore a più variabili contemporaneamente:

var_1 = var_2 = … = var_n = espressione;

• Ad esempio, l’istruzione:

i = j = k * 2 - 1;

equivale a scrivere:

j = k * 2 - 1;

i = j;

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

Operatori compatti di assegnazione

• La forma sintattica compatta:

nome_var operatore= espressione equivale a scrivere:

nome_var = nome_var operatore espressione dove operatore è uno dei seguenti:

+ - / * % << >> & ^ |

• Ad esempio:

x *= y + 1;

y += 5;

x = x * (y + 1);

y = y + 5;

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

Operatori di assegnazione

• Gli operatori di assegnazione hanno priorità inferiore a tutti gli operatori del C, eccetto l’operatore virgola

• L’associatività vale inoltre da destra verso sinistra, contrariamente agli operatori aritmetici e logici

• Esempi:

y = x /= z += !j - 5;

equivale a... y = (x /= (z += ((!j) - 5)));

oppure a: z = z + ((!j) - 5);

x = x / z;

(5)

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 25

Operatori di incremento e decremento

• In C esistono due operatori unari “speciali”:

++ incremento di uno (“autoincrement”) -- decremento di uno (“autodecrement”)

• Essi permettono di incrementare o decrementare di un’unità la variabile cui sono applicati

• Si possono applicare in due modalità:

è prefissa (es. ++i): la variabile viene modificata prima di utilizzarne il valore

è postfissa (es. k--): la variabile viene modificata dopo averne utilizzato il valore

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 26

Operatori di incremento e decremento

• Il vantaggio di impiegare gli operatori ++ e -- risiede nel fatto di ridurre il numero di espressioni nel codice

• Ad esempio, l’istruzione:

j = 2 * (++i); corrisponde a…

mentre:

j = 2 * (i++); equivale a...

i = i + 1;

j = 2 * i;

j = 2 * i;

i = i + 1;

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 27

Operatori di incremento e decremento

• ATTENZIONE:

i = i++; è indefinita !!!

j = 3/i - 2*(--i); è indefinita !!!

Infatti, il linguaggio non specifica quando viene effettuato l’autoincremento o l’autodecremento rispetto alla valutazione degli altri elementi dell’istruzione.

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 28

Operatori bit a bit (o bitwise)

• Il linguaggio C definisce sei operatori che manipolano i bit

• Gli operatori logici sui bit sono:

~ operatore (unario) di complemento

& operatore AND

^ operatore OR esclusivo

| operatore OR

• Esistono anche due operatori di traslazione sui bit:

<< traslazione (shift) a sinistra

>> traslazione (shift) a destra

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 29

Operatori logici: EXOR (or esclusivo)

A B U

0 0 0

0 1 1

1 0 1

1 1 0

U = A ^ B

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 30

Operatori logici: EXOR

A ^ B vale 0 se gli operandi sono entrambi 0

oppure entrambi 1 A ^ B vale 1 se gli operandi hanno valori

logici differenti

(6)

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 31

Operatori bit a bit

• Poiché il modo in cui viene gestito il bit di segno dipende dal compilatore, è meglio applicare tali operatori a variabili di tipo unsigned

• L’operatore ~effettua il complemento a uno dell’operando. Se x è rappresentato da:

1 0 1 1 0 0 1 0 1 0 0 1 1 1 0 0 allora ~x sarà rappresentato da...

0 1 0 0 1 1 0 1 0 1 1 0 0 0 1 1

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 32

Operatori bit a bit

• L’operatore & confronta due operandi effettuandone l’AND logico bit a bit. Se x è rappresentato da

0 0 1 1 1 1 1 1 0 1 0 1 0 0 1 0 mentre y è rappresentato da:

1 0 0 1 1 0 1 1 0 1 1 0 0 1 1 1 allora il risultato dell’espressione x & y sarà...

0 0 0 1 1 0 1 1 0 1 0 0 0 0 1 0

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 33

Operatori bit a bit

• L’operatore ^ effettua l’OR esclusivo (XOR) bit a bit tra due operandi

• Se la variabile x è rappresentata da:

1 1 1 0 1 0 0 0 1 1 0 1 0 0 0 1 mentre la variabile y è data da:

0 1 0 1 1 0 0 1 0 0 0 1 0 0 1 1 il risultato di x ^ y sarà...

1 0 1 1 0 0 0 1 1 1 0 0 0 0 1 0

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 34

Operatori bit a bit

• L’operatore | effettua l’OR bit a bit

• Se la variabile x è rappresentata da:

0 0 1 0 1 1 0 0 1 1 0 1 0 0 1 1 mentre y è data da:

1 1 1 0 1 1 1 1 0 0 0 0 1 0 0 1 allora il risultato di x | y sarà...

1 1 1 0 1 1 1 1 1 1 0 1 1 0 1 1

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

Operatori bit a bit

• Gli operatori di traslazione (o di shift) << e >>

spostano il loro operando sinistro di un numero di bit pari al valore dell’operando destro

• Ad esempio

x << 4;

sposta a sinistra di quattro posizioni il valore di x, e riempie di zeri i bit così liberati

• In termini di numeri binari, se x è dato da:

0 0 1 0 1 1 1 0 1 0 1 1 0 1 1 1 allora il risultato di x << 4 sarà...

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

Operatori bit a bit

• In modo analogo, lo shift a destra viene effettuato dall’operatore >>

• In tale caso, però, il riempimento dei bit liberati dipende dal tipo dell’operando:

– se l’operando è unsigned, i bit liberati sono posti a 0 – se l’operando è signed, su alcuni sistemi i bit liberati vengono posti uguali al bit di segno, su altri messi a 0

• Ad esempio, se x è di tipo unsigned char (8 bit) e vale B8h:

1 0 1 1 1 0 0 0 allora il risultato di x >> 3 sarà...

(7)

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 37

Espressioni condizionali

• Le espressioni condizionali fanno uso dell’operatore ternario ?:

• La sintassi di un’espressione condizionale è:

espressione_1 ? espressione_2 : espressione_3

• Dapprima viene valutata l’espressione_1; se essa risulta vera (ossia ha valore non nullo), allora viene valutata l’espressione_2, il cui valore diventa il risultato dell’espressione condizionale

• In caso contrario, viene valutata l’espressione_3, il cui valore diventa il risultato dell’intero costrutto

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 38

Espressioni condizionali

• Ad esempio, le istruzioni if (a > b)

z = a;

else z = b;

• possono essere tradotte nel costrutto z = (a > b) ? a : b ;

• Si noti che, se n è un int ed f un float, l’espressione:

(n > 0) ? f : n

restituisce un valore float, indipendentemente dal fatto che n sia positivo o meno (promozione di tipo)

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 39

Precedenza degli operatori

• La seguente tabella riassume le regole di precedenza e associatività di tutti gli operatori del linguaggio C

• Gli operatori sulla stessa linea hanno la stessa precedenza

• Le righe sono in ordine di precedenza decrescente

• Si osserva che gli operatori unari + e - hanno precedenza maggiore delle rispettive forme binarie

• Nella seconda riga compaiono anche l’operatore di deriferimento * , quello di indirizzo & e quello di membro di una struttura (l’operatore punto “.” ) Questi non vanno confusi con gli omonimi operatori logici o aritmetici!

Fondamenti di Informatica - Linguaggio C - Espressioni e operatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 40

Precedenza degli operatori

operatori () [] -> .

! - + ++ -- * & ( tipo ) sizeof

* / % + -

<< >>

< <= > >=

&

^

|

&&

||

?:

= += -= /= *= %= &= ^= |= <<= >>=

, (virgola )

== !=

associatività da sinistra a destra da destra a sinistra da sinistra a destra da sinistra a destra da sinistra a destra da sinistra a destra

da sinistra a destra da sinistra a destra da sinistra a destra da sinistra a destra da sinistra a destra da destra a sinistra da destra a sinistra da sinistra a destra da sinistra a destra

Riferimenti

Documenti correlati

© 2001 Pier Luca Montessoro, Davide Pierattoni (si veda la nota di copyright alla slide n.. PIER LUCA

© 2001 Pier Luca Montessoro, Davide Pierattoni 1 (si veda la nota di copyright alla slide n.. PIER LUCA

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere la nota di copyright a pag.2) 2 Questo insieme di trasparenze (detto nel seguito slide) è protetto dalle leggi sul copyright

© 2001 Pier Luca Montessoro, Davide Pierattoni 1 (si veda la nota di copyright alla slide n.. PIER LUCA

© 2001 Pier Luca Montessoro, Davide Pierattoni 1 (si veda la nota di copyright alla slide n.. PIER LUCA

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 2 Questo insieme di trasparenze (detto nel seguito slide) è protetto dalle leggi sul copyright

© 2007 Pier Luca Montessoro, Davide Pierattoni 1 (si veda la nota di copyright alla slide n.. PIER LUCA

© 1999 Pier Luca Montessoro (si veda la nota a pagina 2) 2 Questo insieme di trasparenze (detto nel seguito slide) è protetto dalle leggi sul copyright e dalle disposizioni